学无先后,达者为师

网站首页 编程语言 正文

为什么一级封锁协议不能保证不读取到脏数据

作者:暗诺星刻 更新时间: 2022-05-11 编程语言

为什么一级封锁协议不能保证不读取到脏数据?

  • 为什么一级封锁协议不能保证不读取到脏数据

  一级封锁协议可以保证某事务在修改数据之前必须先加直到事务结束才会释放的排他锁,这看起来就已经阻止了脏读,那为什么各个书中都表示一级封锁协议不能保证不读取到脏数据呢?

  这还是要归咎于各个书籍编写者对于概念定义的疏忽大意。在弄清这个问题之前,需要澄清被很多人误解的概念。比如什么是脏读、一级封锁协议等。笔者已经将这部分的内容独立成了另一篇博客,可见:

剖析数据库中重要而又常被曲解的概念:
https://blog.csdn.net/wangpaiblog/article/details/122780648

为什么一级封锁协议不能保证不读取到脏数据

  有了前面的铺垫,现在就可以很方便地解释这个问题了。因为一级封锁协议只针对修改作出限制,没有对读取作出约束。在这种情况下,如果一个事务已经修改了数据,对该数据加了排他锁。此时,如果另一个事务只是读取而不修改该数据,则该事务就会读到“脏”数据。

  为什么加了排他锁之后还可以读取呢?因为排他锁本身不能阻止修改和读取,它只能根据自身的互斥法则来进行限制。当事务只是读取数据时,根据一级封锁协议,它不需要先加任何锁,因此它的读数据操作不会受到限制而成功进行。

  那一级封锁协议如何阻止并发修改呢?如果另一个事务只修改而不读取。那么根据一级封锁协议,它需要先加排他锁,但问题是该数据已经加了排他锁,所以这次的加锁操作将不能成功,从而使得这个事务无法修改数据。


【注意】

  有人对 为什么一级封锁协议不能保证不读取到脏数据 的解释是,如果一个事务在其它事务加排他锁之前读取该数据,这个事务就会读取到脏数据,所以一级封锁协议不能保证不读取到脏数据。这是错误解释。在加排他锁之前读取到的数据是“旧”数据,而不是“脏”数据。


原文链接:https://blog.csdn.net/wangpaiblog/article/details/122787733

栏目分类
最近更新