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


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

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

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

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

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

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

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

  注意:读和写在逻辑上本身就是不同的概念,不能认为写比读要严格,所以限制了写就等同于限制了读。有些读者可能从人类的角度来理解,觉得写之前必须要读(看不见就不可能写)。但对计算机而言,写之前并不需要读。在编程的很多领域,读和写的权限都是划分为两个不同的权限。只有需要一种对原值递增的写操作,才需要先读后写。


【注意】

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

  对数据库的 旧数据 本来就要慎重考虑是否应该继续使用。如果执意使用 旧数据,那后面无论加任何锁都规避不了这种风险。


  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值