为什么PostgreSQL会中止这个可序列化的时间表[英] Why does PostgreSQL abort this serializable schedule

本文是小编为大家收集整理的关于为什么PostgreSQL会中止这个可序列化的时间表的处理方法,想解了为什么PostgreSQL会中止这个可序列化的时间表的问题怎么解决?为什么PostgreSQL会中止这个可序列化的时间表问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

理论表明,一组并发事务是可序列化的,当且仅当它们的并发执行等同于它们可能的串行执行之一.

现在事务T1和T2的以下并发执行是可序列化的,因为它相当于串行执行"T1 then 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.

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

本文地址:https://www.itbaoku.cn/post/1763944.html