PostgreSQL中REPEATABLE READ事务SELECT FOR UPDATE的快照生成时机
PostgreSQL REPEATABLE READ隔离级别下事务快照生成时机
针对你提到的场景:两个几乎同时启动的REPEATABLE READ事务,均需执行SELECT ... FOR UPDATE和UPDATE操作,第二个事务的快照生成时机明确如下:
- 排除两个错误时机:
- 不是事务启动时:PostgreSQL的REPEATABLE READ不会在事务刚启动就生成快照,快照的建立和事务的第一个实际数据访问操作绑定。
- 不是SELECT语句到达数据库并尝试加锁时:如果第二个事务的
SELECT ... FOR UPDATE因为第一个事务持有锁而进入等待,这个阶段不会触发快照生成。
- 正确时机:数据库释放锁并完成SELECT语句执行时。当第一个事务释放目标行的锁后,第二个事务的
SELECT ... FOR UPDATE才会真正开始执行,此时PostgreSQL会为该事务生成专属快照。后续事务内的所有操作(包括后续的UPDATE)都会基于这个快照读取数据,确保整个事务期间看到的数据状态一致,符合REPEATABLE READ的隔离要求。
补充一点:这个快照一旦生成就不会改变,哪怕后续有其他并发事务提交了对同一数据的修改,当前事务也只会看到快照建立时的数据状态。
内容的提问来源于stack exchange,提问作者Tigran Rostomyan
相关产品推荐
相关产品推荐

