繁体   English   中英

为什么PostgreSQL会中止这个可序列化的时间表

[英]Why does PostgreSQL abort this serializable schedule

理论指出,当且仅当它们的并发执行等效于其可能的串行执行之一时,一组并发事务才是可序列化的。

现在,事务T1和T2的以下并发执行是可序列化的,因为它等同于串行执行“T1然后T2”

T1: r1x   w1y  c1
T2:    w2x   c2

(i.e., T1 reads x, T2 writes x, T1 writes y, T2 commits, and finally, T1 commits)

但是,在PostgreSQL 10.4中试用时,如下所示:

T1: begin
T1: set transaction isolation level serializable;
T2: begin
T2: set transaction isolation level serializable;
T2: update variables set value = value + 1 where name = 'x'
T1: update variables set value = value + 1 where name = 'y'
T2: commit
T1: commit

当此事务尝试提交时,数据库将中止T1。 为什么?

PostgreSQL使用启发式方法来确定是否中止可序列化的事务,因为它确实太难了。 因此,即使存在等效的串行执行(误报),也可能发生事务中止。

但我怀疑在这种情况下有不同的原因。 如果查看执行计划,您可能会看到顺序扫描。 现在,顺序扫描会读取所有行,因此T2在更新期间读取了y

可序列化事务的行为取决于所选的执行计划!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM