目录
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事务无法对数据进行修改,从而避免了不可重复读问题的发生。