事物快照
一个数据页包含了每一行的多个版本,每一行的可见版本一起构成一个快照。
快照只包含在创建快照时当前已提交的数据,在这个特定的时刻提供了一个一致性的视图,这个视图我们就可以叫做快照。
为了确保数据的隔离性,每一个事物都有自己的快照,这就意味着不同的事物在不同的时间点可以看到不同的快照。但是单个快照内部是一致的。
在 Read Committed 隔离级别中,每个语句开始都会有一个快照,并且在该语句执行期间,仍然保持活动状态。
在Repeatable Read和Serializable隔离级别中,每个事物的第一条语句开始之处只会有一个快照,在整个事物结束之前,该快照一直是活动的。
隔离级别
pg数据库事务的隔离级别有以下四种:
(1)读未提交(READ UNCOMMITTED)
(2)读已提交(READ COMMITTED)
(3)重复读(REPEATABLE READ)
(4)串行化(SERIALIZABLE)
并发事务,不希望发生的行为
(1)脏读:一个事务读取了另一个未提交的事务写入的数据。
(2)不可重复读:一个事务重新读取前面读取过的数据时,发现该数据已改变。
(3)幻读:一个事务开始后,需要根据数据库中现有的数据做一些更新,于是重新执行一个查询,返回符合查询条件的行,这时发现这些行因为其它最近提交的事务而发生了改变,导致现有事务如果再进行下去可能发发生逻辑上的错误。
不同事务隔离级别的行为:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可能 | 可能 | 可能 |
读已提交 | 不可能 | 可能 | 可能 |
重复读 | 不可能 | 不可能 | 可能 |
可串行化 | 不可能 | 不可能 | 不可能 |
但是PostgreSQL里默认的隔离级别是"读已提交"。所以读未提交在pg中脏读是不可能的,可重复读在pg中幻读是不可能的。
在PostgreSQL里,可以请求四种可能的事务隔离级别中的任意一种。
但在内部,实际上只有三种独立的隔离级别,分别对应读已提交,可重复读和可串行化。
如果选择了读未提交的级别, 实际上用的是读已提交,
设置事务的隔离级别
要设置一个事务的事务隔离级别,使用SET TRANSACTION命令:
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transactio
标签:postgressql,事务,快照,隔离,数据库,可能,提交,级别
From: https://blog.csdn.net/Re_view/article/details/139271975