维基百科定义了以下术语:
只要我正确地解释它,可序列化和可重复读取隔离级别都对应于严格两相锁定 (在这种状态下,共享和独占模式锁一直保持到事务提交/中止为止),根据书名为Korth等人.,事务可以通过提交顺序来序列化。
然而,Korth等人的书中也提到了以下可重复阅读隔离级别:
我的疑问是,如果严格的2PL时间表可以通过事务的提交顺序来序列化,那么为什么Korth等人说可重复读取隔离级别不能确保序列化呢?
发布于 2019-11-15 02:35:49
可序列化意味着事务可以在没有重叠的情况下按一定顺序运行,通过并行运行事务和可序列化隔离级别,我们将得到与数据库相同的答案和状态。
给定两个事务,A和B,系统的唯一有效状态是
就这样。如果系统可能处于任何其他状态,则事务是不可序列化的。如果我们可以显示并行运行的两个事务不对应于这些状态中的一个或另一个,那么这些事务是不可序列化的。
考虑一个4行的表,ID值为2、4、6和8。有两个事务A和B。A计数行数。B插入两行,ID值分别为3和7。
如果它们运行A->B,则A返回4。如果它们运行B->A,则A返回6。如果要保证序列化,这是唯一可能的答案。
所以A是在可重复读隔离条件下开始的。它将执行表格扫描。A读取第2行并接受锁,然后读取第4行并获取锁。
现在B与A并行启动,B试图插入第3行。没有什么能阻止它;A从未读取ID为3的行来锁定它。然后B插入第7行并提交,释放其锁。
事务A继续读取。它刚刚完成了4,所以下一行是6,然后是7 (Tx已经提交,所以它的锁7已经释放),最后是8。所以A看到了第2、4、6、7和8行--5行!此工作负载不可序列化。
这是Korth引用的第二个要点中的场景。
“问题”是B产生的幻影行,它们重叠A将要读取的数据范围,但是可重复读取不会发出范围锁,所以B可以自由地这样做。在可序列化隔离条件下,B的插入锁会阻止A获取范围锁,或者A的范围锁会阻止B的插入。
https://dba.stackexchange.com/questions/232004
复制相似问题