数据库三级封锁协议和两段锁协议区别

三级封锁协议用于解决修改丢失、不可重复读和读脏数据问题,解决问题的焦点是给数据库对象何时加锁、加什么样的锁
一级封锁协议:事务T在修改数据R之前必须对其加X锁,直到事物结束时释放,解决修改丢失问题,但不解决不可重复读和读脏数据问题。
【例】 假设: T1,T2两个事务,均要对数据A=100修改。T1修改前,对A加排他锁,T2必须等待T1释放后,才能加锁修改,解决T2修改数据后,丢失T1修改数据问题。在一级封锁协议中,读数据时是不用加锁的,T2在任何时刻是可以读的。假设在修改前T2读A=100,修改后,再读A时,A!=100,存在不可重复读;再假设T1修改后,T2读A=200,读取后,T1回滚事物,A实际值=100,T2读到A=200是脏数据。
二级封锁协议:在一级封锁协议的基础上,事务T在读取数据R前,必须对其加S锁,读完后即可释放,解决读脏数据问题,但解决不了不可重复读问题。
【例】 假设: T1,T2两个事务,T1对数据A=100进行修改,T2在读取A前,必须加S锁,此时T2必须等到T1事务结束(提交或者回滚)才能读,此时不存在读脏数据问题。假设在修改前T2读A=100,读完立即释放,T1修改后,再读A时,A!=100,还存在存在不可重复读问题。
三级封锁协议:在一级封锁协议的基础上,事务T在读取数据R前,必须对其加S锁,直到事务结束方可释放,解决不可重复读问题
【例】 假设: T1,T2两个事务,T2在读取A前,必须加S锁,事务不结束不释放,T1事务,必须等待T2释放S锁后,才能进行修改,解决T2在同一事务中,两次读取的数据不一致问题。

三级封锁协议不能保证并发操作下事务最终的执行结果和这些事务串行的某个执行结果一致(如有事务A和事务B,串行先执行A执行完成再执行B或者串行先执行B执行完成再执行A,两次结果中的某一次结果一致即可)
两段锁协议解决的是事务调度问题,解决问题的方法是将加锁和锁的释放分为两个阶段,加锁阶段只加锁不释放,只要一个锁开始释放,进入释放阶段,只释放,不加锁,两段锁协议是确保执行结果和这些事务串行的某个执行结果一致的充分条件

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值