协议"/>
并发控制之封锁协议
什么是封锁协议
在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为封锁协议(Locking Protocol)。
何时申请X锁或S锁
持锁时间
何时释放
对封锁方式规定不同的规则,就形成了各种不同的封锁协议,它们分别在不同的程度上为并发操作的正确调度提供一定的保证。
三级封锁协议
1.一级封锁协议
2.二级封锁协议
3.三级封锁协议
一级封锁协议
一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
正常结束(COMMIT)
非正常结束(ROLLBACK)
一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
使用封锁机制解决丢失修改问题
没有丢失修改
事务T1在读A进行修改之前先对A加X锁
当T2再请求对A加X锁时被拒绝
T2只能等待T1释放A上的锁后获得对A的X锁
这时T2读到的A已经是T1更新过的值15
T2按此新的A值进行运算,并将结果值A=14写回到磁盘。避免了丢失T1的更新。
二级封锁协议
二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
二级封锁协议可以防止丢失修改和读“脏”数据。
在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
使用封锁机制解决读“脏”数据问题
不读“脏”数据
事务T1在对C进行修改之前,先对C加X锁,修改其值后写回磁盘
T2请求在C上加S锁,因T1已在C上加了X锁,T2只能等待
T1因某种原因被撤销,C恢复为原值100
T1释放C上的X锁后T2获得C上的S锁,读C=100。避免了T2读“脏”数据
三级封锁协议
三级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议可防止丢失修改、读脏数据和不可重复读。
使用封锁机制解决不可重复读问题
可重复读
事务T1在读A,B之前,先对A,B加S锁
其他事务只能再对A,B加S锁,而不能加X锁,即其他事务只能读A,B,而不能修改
当T2为修改B而申请对B的X锁时被拒绝只能等待T1释放B上的锁
T1为验算再读A,B,这时读出的B仍是100,求和结果仍为150,即可重复读
T1结束才释放A,B上的S锁。T2才获得对B的X锁
封锁协议小结
三级协议的主要区别
什么操作需要申请封锁以及何时释放锁(即持锁时间)
不同的封锁协议使事务达到的一致性级别不同
封锁协议级别越高,一致性程度越高
欢迎大家加我微信交流讨论(请备注csdn上添加)
更多推荐
并发控制之封锁协议
发布评论