数据库三级封锁协议介绍及说明

数据库三级封锁协议介绍及说明

1级封锁协议

定义: 事务T在修改数据data之前必须先对其加X锁,直到事务结束才释放。

事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。

效果: 1级封锁协议可防止修改丢失,并保证事务T是可恢复的。

说明: 事务T的写操作加了"X排他锁", 所以其他事务不可修改, 因此可防止修改丢失.

备注: 这里的"修改丢失"指的是事务T内的修改, 在事务T提交或回滚之前, 不可能发生"被其他事务修改覆盖"的情况.

只读的情况: 在1级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读"脏"数据。

说明:

事务T内, 读数据data不加锁, 这就意味着其他事务(如: 事务W)可以加X锁对数据data进行修改, 如果事务W修改后还未提交, 这时在事务T内, 再次读取数据data, 就发生了"脏读"; 如果事务W修改后提交了, 这时在事务T内, 再次读取数据data, 就发生了"不可重复读".

2级封锁协议

定义: 1级封锁协议 + “事务T在读取数据data之前必须先对其加S锁,读完后即可释放S锁”。

效果: 2级封锁协议除防止了修改丢失,还可进一步防止读"脏"数据。

说明:

事务T内, 读取数据data时, 因为添加了S锁, 所以其他事务们只能读取, 也不可以"修改"(因为S锁和X锁互斥), 所以在事务T内, 读取数据data时, 其他事务不可进行修改操作, 但读取结束后, 释放了S锁, 故别的事务(如: 事务W)就可以获取X锁, 对数据data进行了修改并提交(意味着释放了X锁), 这时在事务T内, 再次读取数据data, 读取之前先加S锁(因为事务W的X锁已释放, 所有S锁是可以得到的), 这时读取的就是事务W修改提交的"新数据"了, 这就发生了"不可重复读".

3级封锁协议

定义: 1级封锁协议 + “事务T在读取数据data之前必须先对其加S锁,直到事务结束才释放S锁”。

与2级协议的定义对比逐字一下:

1级封锁协议 + "事务T在读取数据data之前必须先对其加S锁,读完后 即可释放S锁
1级封锁协议 + "事务T在读取数据data之前必须先对其加S锁,直到事务结束 才释放S锁

效果: 3级封锁协议除防止了修改丢失和不读’脏’数据外,还进一步防止了不可重复读。

说明:

事务T内读取数据时, 在事务结束之前都不会释放S锁, 所以就不存在其他事务"修改"的可能性(原因: S和X锁互斥), 所以就没有"脏读"和"可重复读"的情况.

总结

由上可以看出, 3级封锁协议才可以完美地同时解决并发控制的三个问题:

  • 修改丢失 (或修改覆盖)
  • 脏读
  • 不可重复读

参考

数据库三级封锁协议
什么是数据库中的封锁协议?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值