首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测到可序列化的隔离冲突?

如何检测到可序列化的隔离冲突?
EN

Stack Overflow用户
提问于 2022-05-30 06:11:51
回答 2查看 108关注 0票数 0

有人知道SQL数据库如何检测可序列化的隔离冲突(SIV)吗?这似乎只是简单的蛮横,强迫事务执行的每一个排列都找到并发执行结果的匹配,以验证可序列化性不会扩展。

根据一位第三方研究人员的文章:failure.pdf

SIV是在两个事务同时发生时发生的,而最近的一个事务提交了一些已删除的行,稍后较少的事务也尝试删除这些行。这是MVCC无法处理的情况,因此必须用SIV中止。

这对于检测SIV中涉及删除MVCC中行的查询是有意义的,但我不明白仅使用select和insert查询时如何检测到SIV。例如,AWS中的这个示例:https://aws.amazon.com/premiumsupport/knowledge-center/redshift-serializable-isolation/

有人知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-30 15:20:43

让我把事情简化一下,因为发生的事情很复杂,很容易让树木错过森林。

  1. 2事务正在运行( BEGIN ),两者都在使用自己的数据库状态,该数据库状态与开始发生时的数据库状态匹配。
  2. 每个事务修改一个表,该表是另一个事务的初始状态的一部分。

就这样。Redshift并不“知道”其他事务所做的更改对此事务正在进行的结果具有重要意义。只是因为它可能是物质。因为它可能是实质性的,所以存在序列化危险,并且一个事务被中止,以防止产生不确定结果的可能性。

这个主题有很多复杂性和细微之处,只有当您试图理解为什么某些情况、时间和SQL有效,而其他情况却不起作用时,这才是很重要的。这就进入了谓词锁定,这就是Redshift“知道”如果在其他地方进行的某些更改会影响到对此事务具有重要意义的初始状态的一部分。也就是一堆簿记。这就是为什么"select * from tab1“在链接的知识中心文章中很重要的原因--它为这个事务创建了”谓词锁“。

票数 1
EN

Stack Overflow用户

发布于 2022-05-30 06:21:59

PostgreSQL使用启发式方法检测序列化冲突。读取数据会导致接受谓词锁(SIReadLock),并检查是否存在危险的结构,在每次串行化违规时必然会发生这种情况。这意味着您可以获得错误的肯定序列化错误,但永远不会假否定。

这在在文件中参考的科学论文中都有描述,我们希望亚马逊在这一领域没有对PostgreSQL进行太严重的黑客攻击。

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

https://stackoverflow.com/questions/72429816

复制
相关文章

相似问题

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