Oracle的Restart Update机制在PostgreSQL中是否有类似实现?
PostgreSQL是否存在类似Oracle的Restart Update机制
我正在阅读《Oracle Database Transactions and Locking Revealed》一书的第4章“并发与多版本控制”,了解到Oracle中存在Restart Update机制(Oracle会从头重启Update语句),想知道PostgreSQL中是否有类似的机制?
Oracle机制示例
Tx1: Update table set col1=0 (旧值为col1=2); <未提交>; Tx2: Update table set col2=... where col1>0; Tx1: commit; Tx2: Oracle数据库会重启这条update语句;
回答
PostgreSQL没有与Oracle完全相同的自动重启Update语句的机制。
在PostgreSQL的并发处理逻辑中:
- 当Tx2执行UPDATE时,如果目标行被Tx1持有行级锁,Tx2会进入等待状态,直到Tx1提交或回滚。
- Tx1提交后,Tx2会基于最新的行数据重新检查WHERE条件是否匹配(依托PostgreSQL的MVCC多版本并发控制特性),但不会像Oracle那样从头完整重启整个UPDATE语句。
- 只有在
SERIALIZABLE隔离级别下,当事务触发序列化冲突时,PostgreSQL会抛出could not serialize access due to concurrent update错误,此时需要应用层自行捕获该错误并重试整个事务,数据库不会自动重启单条语句。
内容的提问来源于stack exchange,提问作者Blocked
相关产品推荐
相关产品推荐

