PostgreSQL事务快照为何失效?附操作步骤求助
问题原因与修正方案
核心问题
你在第一个repeatable read隔离级别的事务中导出的快照,是事务启动时的初始快照,并不包含你之后插入的数据。
- PostgreSQL的
repeatable read隔离级别下,事务的快照是启动时固定的——虽然当前事务能看到自己后续执行的插入操作,但pg_export_snapshot()导出的是事务刚启动时的数据库状态快照(此时表中还没有你插入的那条数据)。 - 因此第二个事务通过该快照查询时,看到的是第一个事务启动时的空表,行数自然为0。
修正操作步骤
方案:更换第一个事务的隔离级别
- 开启第一个事务,设置隔离级别为
read committed - 向表中插入一行数据
- 查询表中行数,结果为1
- 执行
select pg_export_snapshot();
- 开启第二个事务,隔离级别为
repeatable read - 执行
set transaction snapshot '导出的快照ID'; - 查询表中行数,结果为1
注意事项
- 第一个事务在第二个事务完成查询前,不能提交或回滚,否则第二个事务使用该快照时会触发报错。
内容的提问来源于stack exchange,提问作者Davidaa_WoW
相关产品推荐
相关产品推荐

