首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么PostgreSQL要中止这个可序列化的计划?

为什么PostgreSQL要中止这个可序列化的计划?
EN

Stack Overflow用户
提问于 2018-06-11 22:56:20
回答 1查看 267关注 0票数 4

理论上说,一组并发事务是可串行化的当且仅当它们的并发执行等同于它们可能的串行执行之一。

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

代码语言:javascript
复制
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中尝试时,如下所示:

代码语言:javascript
复制
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。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 05:26:14

PostgreSQL使用启发式方法来确定是否中止可序列化的事务,因为这太难准确了。因此,即使存在等效的串行执行(假阳性),事务也可能被中止。

但我怀疑这个案子有不同的原因。如果您查看执行计划,您可能会看到顺序扫描。现在,顺序扫描读取所有行,因此T2在其更新过程中读取了y

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50807118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档