第七章 事务管理(并发控制技术2)
第七章 事务管理(并发控制技术2)
基于图的协议
死锁
多粒度锁
使用锁一定会保证事务顺利的并发执行吗?执行会成功吗?
一 基于图的协议*
1.1 概述
基本思路:
若要开发“非两阶段封锁的、但要求保证冲突可串行化的”
协议,则一般需要每个事务如何存取数据库的附加信息。
可以开发各种不同模型,一类最简单的模型是偏序:
要求所有数据项集合D满足一种偏序‘-> ’,即
D = {d1, d2 ,..., dh} 对任何i,都有 didi+1
这种偏序的本质含意是要求:
如果 di -> dj ,那么任何访问di 和dj的事务,都必须保证di 先于 dj被访问。
(即:所有事务对D中数据项的访问,都必须遵从偏序约束)
直观示例:
想象一群人在一个餐厅享用自助餐:
如要求统一从左至右方向有序取食,则不会发生争抢混乱。
偏序意味着集合D可以视为是一个有向无环图.
比如,下面的树协议就是一种简单的基于图的协议。
1.2 树形协议
如何理解树协议?
树形协议是一种特殊的偏序关系:
所有数据项按照从上到下的父子关系,排出一种偏序(所有事务需按此偏序访问数据项)
1.3 树形协议的优点
图15-12中的调度符合树协议吗?
符合树协议
(一般地)树形协议调度都是可串行化的调度!
树形协议为什么不会产生死锁?
Q不可能出现“T1锁住E后又请求锁D,而T2锁住D后又请求锁E”的死锁情形!
因为:T1锁住E前必先锁住父节点B,这时T2不能申请到D锁,因它之前申请不到B锁(等待T1释放)(树形协议只有X锁,如有S锁则会出现死锁现象)
调度P:存在死锁现象,它符合树形协议吗?
(出现死锁,但T3不符合第2条,因E的父节点B未加锁)(这正是协议要先锁父节点的原因)
调度Q:符合树形协议, 它存在死锁现象吗?
符合,且不存在死锁!
1.4 树形协议的缺点
树形协议能保证可恢复性吗?
要保证可恢复性应如何修改协议?
只需将树形协议修改为:在事务结束前不允许释放任何X锁!(牺牲一定的并发度)
树形协议不能保证可恢复性!(T13虽读了T10的数据D,但T13已提交不能再回滚)
树形协议能保证无级联卷回吗?
要保证无级联回卷应如何修改协议?
树形协议不能保证无级联卷回!(T12和T13都读了T10的数据,T10卷回时T12和T13也卷回)
1.5 树形协议小结
优点
树形协议保证了冲突可串行化;
同时不会产生死锁,不需要回滚;
树形协议可较早地释放锁,以减少事务间的等待时间,从而可增强调度的并发性。
缺点
树形协议不能保证事务的可恢复性;
事务不能保证不发生级联回滚;
事务有可能会给那些根本不访问的数据项加锁,从而增加了锁的开销和额外的等待时间,引起并发性降低。
比如:一事务要处理A和J数据项,如何加锁?
不仅要求给数据项A和J加锁,
还必须给数据项B、D和H加锁!
二 死锁处理
2.1 死锁检测方法
什么是等待图,主要用途?
2.2 死锁的解除方法p.381
出现死锁时如何解除?
死锁只能是发生后才想法解除吗?
可采用预防策略:
避免死锁出现!
三 多粒度封锁协议
什么是多粒度封锁,作用?
3.1 多粒度锁
通俗示例:教学大楼使用的管理(如仅一种锁:大楼锁/教室锁)
1)某单位租用整栋大楼用于培训,需要上大量教室锁?太繁琐
2)若仅租用部分教室而上大楼锁,剩下的没法自习?共享差
多粒度锁:
允许使用多种粒度/大小不同的锁
(不同粒度:楼,层,教室,座位)
数据库、区域、文件、记录、属性
什么是隐式封锁,显示封锁,意向锁?
意向锁
IS锁:
如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加 S锁。例如,要对某个元组加 S锁,则要首先对关系和数据库加 IS锁。
IX锁:
如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。例如,要对某个元组加 X锁,则要首先对关系和数据库加 IX锁。
SIX锁:
如果对一个数据对象加 SIX锁,表示对它加 S锁,再加IX锁,即 SIX=S+IX。例如对某个表加 SIX锁,则表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁)。
多粒度锁加锁示例
当Ti已加锁时, Tj加锁还能成功吗?
3.3 多粒度封锁协议p.383
多粒度封锁协议规则及基本特点?
死锁是怎么产生的?应该如何预防?