You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:43:13