如何检测可序列化隔离违规?

How are serializable isolation violations detected?

有谁知道 SQL 数据库如何检测可序列化隔离违规 (SIV)?似乎只是简单地强制事务执行的每个排列来找到并发执行结果的匹配以验证可串行化性不会扩展。

根据第三方研究人员的这篇论文:https://amazonredshiftresearchproject.org/white_papers/downloads/multi_version_concurrency_control_and_serialization_isolation_failure.pdf

SIV 发生在两个事务同时发生时,最近的事务提交了一些已删除的行,而较晚的事务后来也试图删除这些行。这是MVCC无法处理的情况,因此不得不中止SIV。

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

有人知道吗?

PostgreSQL 使用试探法检测序列化违规。读取数据会导致使用谓词锁 (SIReadLock),并检查 危险结构 ,这在每次序列化违规中都必然发生。这意味着您可能会得到假阳性序列化错误,但绝不会出现假阴性。

这就是所有描述 in the documentation and in the scientific paper referenced there,我们可以希望 Amazon 没有在那个领域对 PostgreSQL 进行太糟糕的攻击。

让我把事情简单化,因为很多事情都很复杂,很容易只见树木不见森林。

  1. 2 笔交易正在进行中(开始)并且都在使用自己的交易 与 BEGIN 时的数据库状态匹配的数据库状态 发生了。
  2. 每个事务都会修改一个 table,它是 其他交易的初始状态。

就是这样。 Redshift 不“知道”另一个事务正在 material 对此事务所做的结果进行更改。只是它可能是 material。由于它可能是 material,因此存在序列化风险并且一个事务被中止以防止不确定结果的可能性。

这个主题有很多复杂性和细微差别,只有当您试图理解为什么某些情况、时间和 SQL 有效而其他情况无效时,这一点才重要。这进入了谓词锁定,这就是 Redshift 如何“知道”是否在其他地方进行的某些更改正在影响此事务的 material 初始状态的一部分。 IE。一堆簿记。这就是为什么“select * 来自 tab1”在链接的 knowledge-center 文章中很重要 - 它为该事务创建了“谓词锁”。