Postgresql - Transaction - Snapshot

本文深入探讨了PostgreSQL中的事务隔离级别,包括READ COMMITTED和REPEATABLE READ,通过具体实验展示了如何利用快照查看特定事务前的数据状态,揭示了数据库如何通过版本号进行数据查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在PG内部,可以设置三个不同的隔离级别,对应于读提交、可重复读取和可序列化的级别。默认为READ COMMITTED。

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }

这个在另一篇文章中有介绍和实验。

 

READ COMMITTED隔离级别,意味着可以看到已提交的数据,无法看到未提交的数据,所以可能造成幻读。

当我们有需要的时候,可以选择更高的安全隔离级别,REPEATABLE READ,提供了更强的保证。意味着我们只能看到事务开始之前已经提交的数据。在事务完成之前,其他回话引起的任何更改对我们都是不可见。

 

重点是,每个事务都具有不同的数据库数据。每个事务都可以看到以前事务提交的数据的快照,以及在事务本身中创建的所有尚未提交的数据。

“以前的事务”的含义取决于您何时开始您的语句(在read committed中)或何时开始您的事务(在repeatable read中),但在这两种情况下,都无法选择。如果需要同步状态,这可能是一个问题,因为无法保证不同的语句或事务将完全同时启动。

 

这时,可以设置你想看哪个事务之前的数据,设置一个snapshot。

 

创建一个实验表。
create table test0115(id int);

session A: 查询一个snapshot点
mytest=# begin;
BEGIN
mytest=# select pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000007-00000037-1
(1 row)

session B: 一个插入数据的事务
mytest=# begin;
BEGIN
mytest=# insert into test0115(id) values (1);
INSERT 0 1
mytest=# insert into test0115(id) values (2);
INSERT 0 1
mytest=# commit;
COMMIT

Session C: 关键点!!!
mytest=# select * from test0115;
 id
----
  1
  2
(2 rows)
mytest=# begin isolation level repeatable read;
BEGIN
mytest=# set transaction snapshot '00000007-00000037-1';
SET
mytest=# select * from test0115 ;
 id
----
(0 rows)

是不是灰常神奇的操作!

 

我们来看看数据库做了哪些操作。

当我们执行了Session A 中的语句之后,数据库在$PGDATA/pg_snapshots文件夹下生成了与snapshot同名的文件。

查看文件内容为

vxid:6/328
pid:32460
dbid:16385
iso:1
ro:0
xmin:10093
xmax:10093
xcnt:0
sof:0
sxcnt:0
rec:0

记录了snapshot的一些信息。当我们查询的时候,我们会根据这些版本号,去表中去查询。

mytest=# select xmin,cmin,xmax,cmax,ctid from test0115;
 xmin  | cmin | xmax | cmax | ctid
-------+------+------+------+-------
 10094 |    0 |    0 |    0 | (0,1)
 10095 |    0 |    0 |    0 | (0,2)
(2 rows)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值