当前位置: 代码迷 >> 综合 >> 为什么二级封锁协议可以解决脏读?三级封锁协议可以解决不可重复读?
  详细解决方案

为什么二级封锁协议可以解决脏读?三级封锁协议可以解决不可重复读?

热度:61   发布时间:2023-10-28 10:12:33.0

目录

1.什么是读写锁?

2.一、二、三级封锁协议的内容各是什么?

3.为什么二级封锁协议可以解决脏读?

4.为什么三级封锁协议可以解决不可重复读?


1.什么是读写锁?

       排它锁(Exclusive):简写为X锁,又称写锁。

       共享锁(Shared):简写为S锁,又称读锁。

有以下两个规定:

       1)一个事务对数据对象A加了X锁,就可以对A进行读取和更新。加锁期间其它事务不能对A加任何锁。

       2)一个事务对数据对象A加了S锁,可以对A进行读取操作,但是不能进行更新操作。加锁期间其它事务能对A加S锁,但是不能加X锁。

锁的兼容关系如下表所示:

- X S
X 不兼容 不兼容
S 不兼容 兼容

2.一、二、三级封锁协议的内容各是什么?

       一级封锁协议:要求修改数据时必须加X锁,直到事务结束才释放锁

       二级封锁协议:

             1)要求修改数据时必须加X锁,直到事务结束才释放锁 

             2)要求读取数据时必须加S锁,读取完马上释放S锁无需等待事务结束

       三级封锁协议:

              1)要求修改数据时必须加X锁,直到事务结束才释放锁

              2)要求读取数据时必须加S锁,直到事务结束才释放S锁

3.为什么二级封锁协议可以解决脏读?

       前面我们说过脏读产生的原因:因为B事务读取到了A事务修改过尚未提交的数据,根据二级封锁协议要求:读数据的时候必须加S锁,但因为A事务在修改的时候已经加了X锁,在X锁的基础上是不能加S锁的,所以B事务无法获取S锁,就会导致B事务无法读取A事务中正在操作的数据,从而避免了脏读的发生。

4.为什么三级封锁协议可以解决不可重复读?

       前面我们也说过了不可重复读产生的原因:是因为B事务读取到了A事务已经修改过的数据,导致前后两次读取的数据不一致。现根据三级封锁协议的要求:读取数据时必须加S锁,在S锁的基础上只能加S锁,不能加X锁,所以在B事务读取数据期间,A事务无法对数据进行修改,从而避免了不可重复读问题的发生。