PostgreSQL中Repeatable Read隔离级别行为的困惑与验证
PostgreSQL中Repeatable Read隔离级别的行为验证与理解
你的理解完全正确:PostgreSQL的**Repeatable Read(可重复读)**隔离级别,确实是基于事务启动时已提交数据的快照来实现的。
一旦事务t1以Repeatable Read级别启动,它后续所有的查询都会使用事务启动瞬间的数据集快照,不会看到任何在t1启动后其他事务提交的新数据——这也是你测试中无论t1查询多少次,都看不到t2插入的957这条记录的原因。
你的测试步骤还原(格式化后)
事务t1操作:
-- Transaction t1 BEGIN TRANSACTION ISOLATION LEVEL repeatable read; SELECT MAX(score) FROM scores; -- 结果:950
另一个会话(事务t2)操作:
BEGIN; INSERT INTO scores(score) VALUES (957); COMMIT;
回到未提交的t1再次查询:
SELECT MAX(score) FROM scores; -- 结果仍为950
关于课程描述的差异说明
你看到的Udemy课程描述存在错误,或者是针对其他数据库(如MySQL)的特殊实现。不同数据库对SQL标准中隔离级别的具体实现存在差异:
- PostgreSQL严格遵循SQL标准对Repeatable Read的定义,通过快照隔离保证事务内读取的一致性,完全避免幻读、不可重复读问题。
- 部分数据库(如MySQL)的Repeatable Read实现逻辑不同,虽然也使用同名隔离级别,但行为和PostgreSQL存在区别。
内容的提问来源于stack exchange,提问作者Tushar Roy
相关产品推荐
相关产品推荐

