Sql 如何知道事务方案何时可序列化?

Sql 如何知道事务方案何时可序列化?,sql,transactions,Sql,Transactions,我正在研究SQL,需要知道某个事务方案是否可序列化。我知道确定这一点的方法是生成一个以事务为节点的图,以及节点之间的方向,如果该图是循环的,则该方案是不可序列化的。但这意味着什么?是什么决定了从一个事务到另一个事务的图中是否存在有向边?在这种情况下,序列化是否与将对象写入磁盘的序列化类型相同 感谢所有的见解序列化意味着事务可以以串行方式一个接一个地执行(与对象序列化无关),基本上事务是可序列化的,如果不考虑这些事务的交错顺序,结果将如同它们以串行方式执行一样,如果图形是循环的,那么它是不可序列化

我正在研究SQL,需要知道某个事务方案是否可序列化。我知道确定这一点的方法是生成一个以事务为节点的图,以及节点之间的方向,如果该图是循环的,则该方案是不可序列化的。但这意味着什么?是什么决定了从一个事务到另一个事务的图中是否存在有向边?在这种情况下,序列化是否与将对象写入磁盘的序列化类型相同


感谢所有的见解

序列化意味着事务可以以串行方式一个接一个地执行(与对象序列化无关),基本上事务是可序列化的,如果不考虑这些事务的交错顺序,结果将如同它们以串行方式执行一样,如果图形是循环的,那么它是不可序列化的,并且存在冲突的风险,在这里,隔离级别将有助于决定事务应该以串行方式执行,这意味着首先执行一个事务,然后执行另一个事务,或者它应该以交错方式执行事务,希望没有冲突。
这不是一个完整的答案,但我希望这会有所帮助。

序列化意味着事务可以一个接一个地以串行方式执行(与对象序列化无关),基本上事务是可序列化的,如果不考虑这些事务的交错顺序,结果将如同它们以串行方式执行一样,如果图形是循环的,那么它是不可序列化的,并且存在冲突的风险,在这里,隔离级别将有助于决定事务应该以串行方式执行,这意味着首先执行一个事务,然后执行另一个事务,或者它应该以交错方式执行事务,希望没有冲突。
这不是一个完整的答案,但我希望这会有所帮助。

事务序列化与对象序列化无关。当完全实现时,可序列化事务隔离级别可确保任何一组并发可序列化事务的行为都与某些串行(一次一个)执行序列一致——就好像这些事务一次只运行一个一样。这意味着,如果可以证明数据库事务在单独运行时会做正确的事情,那么它在任何可序列化事务的混合中都会做正确的事情,或者它会在序列化失败时回滚,以便可以从一开始就重试

可序列化事务隔离可以通过多种方式实施。最常见的方案是严格的两相锁定(S2PL)。这是一个非常常见的问题,你经常会看到答案,所以只讨论这个技术方面的事情。还有乐观并发控制(OCC)、可序列化快照隔离(SSI)等

9.1之前的PostgreSQL版本、某些配置中的MS SQL Server以及Oracle的所有版本实际上都不提供可序列化事务。它们允许您请求它们,但实际上提供了快照隔离。从9.1开始的PostgreSQL版本在请求可序列化事务隔离时使用

不可能在SO答案中详细讨论这些技术中的任何一种是如何工作的,但可以总结上述技术:

  • 根据S2PL,事务中的每一次写入都会获得一个不能与任何内容共享的锁,而事务中的每一次读取都会获得一个可以与其他读取共享但不能与写入共享的锁。读取锁需要覆盖扫描索引中的“间隙”。锁一直保持到事务结束,并随着事务的工作对其他事务可见而原子地释放。如果阻塞创建了一个循环,这称为“死锁”,循环中涉及的一个事务将回滚

  • 在OCC下,事务跟踪所使用的数据,而不锁定数据。当请求事务提交时,事务检查是否有任何其他事务修改了其任何数据并提交。如果是这样,提交请求将失败并回滚工作

  • 在SSI下,写操作会相互阻止,但读操作不会阻止写操作,写操作不会阻止读操作。可以跟踪读写依赖关系,以查找可视性模式,该模式将按照明显的执行顺序创建一个循环。如果发现一个“危险结构”,这意味着一个明显执行顺序的循环是可能的,那么可能的循环中涉及的一个事务将回滚。与S2PL相比,它更像OCC,但在更高的争用下没有那么多的回滚


完整披露:我与麻省理工学院的Dan R.K.Ports合作,在PostgreSQL 9.1中实现了新的基于SSI的可序列化事务。

事务序列化与对象序列化无关。当完全实现时,可序列化事务隔离级别可确保任何一组并发可序列化事务的行为都与某些串行(一次一个)执行序列一致——就好像这些事务一次只运行一个一样。这意味着,如果可以证明数据库事务在单独运行时会做正确的事情,那么它在任何可序列化事务的混合中都会做正确的事情,或者它会在序列化失败时回滚,以便可以从一开始就重试

可序列化事务隔离可以通过多种方式实施。最常见的方案是严格的两相锁定(S2PL)。这是一个非常常见的问题,你经常会看到答案,所以只讨论这个技术方面的事情。还有乐观并发控制(OCC)、可序列化快照隔离(SSI)等

9.1之前的PostgreSQL版本、某些配置中的MS SQL Server以及Oracle的所有版本实际上都不提供可序列化功能