我正在研究SQL,需要知道某个事务方案是否可序列化。我知道确定此方法的方法是制作一个图,将事务作为节点,并确定节点之间的方向,如果该图是循环的,则该方案不可序列化。但是,这是什么意思,又是什么决定图中是否存在从一项交易到另一项交易的有向边?在这种情况下,序列化是否与将对象写入磁盘相同?
感谢您的任何见解
事务序列化与对象序列化无关。完全可序列化的事务隔离级别在完全实现后,可以确保任何一组并发可序列化事务的行为与 某些 串行(一次一次)执行序列一致- 就像事务是一次运行一次一样。时间。这意味着,如果您可以证明数据库事务在单独运行时将做正确的事情,则在可序列化事务的任何混合中都将做正确的事情,或者它会因序列化失败而回滚以便可以重试。从头开始。
可序列化的事务隔离可以通过多种方式实施。最常见的方案是严格的两相锁定(S2PL)。这个问题很常见,您经常会在SO上看到答案,这些答案仅就此技术进行了讨论。还包括乐观并发控制(OCC),可序列化快照隔离(SSI)等。
9.1之前的PostgreSQL版本,某些配置中的MS SQL Server和Oracle的所有版本实际上并不提供可序列化的事务。它们让您要求它们,但实际上提供了快照隔离。当请求可序列化的事务隔离时,以9.1开头的PostgreSQL版本使用SSI。
在SO答案中,不可能彻底讨论这些技术中的任何一种是如何工作的,而是要总结上述技术:
在S2PL下,事务中的每个写入都获得一个不能与任何东西共享的锁,事务中的每个读取都获得一个可以与其他读取共享但不能与写入共享的锁。读取锁需要覆盖扫描索引中的“间隙”。锁将保持到事务结束,并随着事务的工作对其他事务可见而自动释放。如果阻塞创建了一个周期,则称为“死锁”,并且该周期中涉及的事务之一将回滚。
在OCC下,事务会跟踪它使用了什么数据,而不会锁定它。当请求事务提交时,该事务检查是否有任何其他事务修改了其任何数据并提交了。如果是这样,则提交请求失败,并且工作会回滚。
在SSI下,写会互相阻止,但读不会阻止写,写不会阻止读。跟踪读写依赖关系以查找可见性模式,这些模式将以明显的执行顺序创建一个循环。如果找到“危险结构”,这意味着可能会执行一个明显的执行顺序,则回退可能循环中涉及的事务之一。与S2PL相比,它更像OCC,但在较高的竞争条件下没有那么多的回滚。
全面披露:我与麻省理工学院的Dan RK Ports合作,在PostgreSQL 9.1中实现了新的基于SSI的可序列化事务。