首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解可重复读隔离级别

理解可重复读隔离级别
EN

Database Administration用户
提问于 2019-03-13 12:53:38
回答 1查看 1.5K关注 0票数 2

维基百科定义了以下术语:

  • 通过基于锁的并发控制DBMS实现,可序列化隔离级别要求在事务结束时释放读和写锁(从所选数据中获取)。此外,当SELECT查询使用range子句时,必须获得范围锁,特别是为了避免幻影读取现象。
  • 在可重复读取隔离级别中,基于锁的并发控制DBMS实现将读和写锁(在所选数据上获取)保持到事务结束为止。但是,范围锁不被管理,因此可能会发生幻影读取。

只要我正确地解释它,可序列化和可重复读取隔离级别都对应于严格两相锁定 (在这种状态下,共享和独占模式锁一直保持到事务提交/中止为止),根据书名为Korth等人.,事务可以通过提交顺序来序列化。

然而,Korth等人的书中也提到了以下可重复阅读隔离级别:

  • 可重复读取只允许读取提交的数据,并且进一步要求,在事务对数据项的两次读取之间,不允许其他事务更新它。
  • 但是,对于其他事务,事务可能不能序列化。例如,当它搜索满足某些条件的数据时,事务可能会找到由提交的事务插入的一些数据,但可能找不到由同一事务插入的其他数据。

我的疑问是,如果严格的2PL时间表可以通过事务的提交顺序来序列化,那么为什么Korth等人说可重复读取隔离级别不能确保序列化呢?

EN

回答 1

Database Administration用户

发布于 2019-11-15 02:35:49

可序列化意味着事务可以在没有重叠的情况下按一定顺序运行,通过并行运行事务和可序列化隔离级别,我们将得到与数据库相同的答案和状态。

给定两个事务,A和B,系统的唯一有效状态是

  1. 所有的A跟着所有的B,或
  2. 所有的B跟着所有的A。

就这样。如果系统可能处于任何其他状态,则事务是不可序列化的。如果我们可以显示并行运行的两个事务不对应于这些状态中的一个或另一个,那么这些事务是不可序列化的。

考虑一个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的插入。

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

https://dba.stackexchange.com/questions/232004

复制
相关文章

相似问题

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