postgressql——数据库快照(5)

本文详细介绍了PostgreSQL中的事务快照,包括事务的隔离级别、快照结构和作用,以及如何设置和获取快照。在PostgreSQL中,每个事务都有自己的快照,确保数据的一致性。快照包含在创建时已提交的数据,提供了在特定时间点的一致性视图。此外,文章还讨论了不同隔离级别下并发事务可能出现的问题,如脏读、不可重复读和幻读,并指出PostgreSQL默认的隔离级别为'读已提交'。
摘要由CSDN通过智能技术生成

事物快照

一个数据页包含了每一行的多个版本,每一行的可见版本一起构成一个快照。
快照只包含在创建快照时当前已提交的数据,在这个特定的时刻提供了一个一致性的视图,这个视图我们就可以叫做快照。

为了确保数据的隔离性,每一个事物都有自己的快照,这就意味着不同的事物在不同的时间点可以看到不同的快照。但是单个快照内部是一致的。

在 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 transact
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值