第七章 事务管理(并发控制技术2)

第七章 事务管理(并发控制技术2)

基于图的协议
死锁
多粒度锁

使用锁一定会保证事务顺利的并发执行吗?执行会成功吗?

一 基于图的协议*

1.1 概述

基本思路:
若要开发“非两阶段封锁的、但要求保证冲突可串行化的”
协议,则一般需要每个事务如何存取数据库的附加信息。
可以开发各种不同模型,一类最简单的模型是偏序:
要求所有数据项集合D满足一种偏序‘-> ’,即
D = {d1, d2 ,..., dh} 对任何i,都有 didi+1
这种偏序的本质含意是要求:
如果 di -> dj ,那么任何访问di 和dj的事务,都必须保证di 先于 dj被访问。
(即:所有事务对D中数据项的访问,都必须遵从偏序约束)
直观示例:
想象一群人在一个餐厅享用自助餐:
如要求统一从左至右方向有序取食,则不会发生争抢混乱。
偏序意味着集合D可以视为是一个有向无环图.
比如,下面的树协议就是一种简单的基于图的协议。

1.2 树形协议
如何理解树协议?
image-20211021212339084

树形协议是一种特殊的偏序关系:
所有数据项按照从上到下的父子关系,排出一种偏序(所有事务需按此偏序访问数据项)

image-20211021212417325
1.3 树形协议的优点

image-20211021214318838

image-20211021214344933

image-20211021214430529

图15-12中的调度符合树协议吗?

符合树协议

(一般地)树形协议调度都是可串行化的调度!

树形协议为什么不会产生死锁?

image-20211021220547816

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锁!(牺牲一定的并发度)

image-20211022171010635

树形协议不能保证可恢复性!(T13虽读了T10的数据D,但T13已提交不能再回滚)

树形协议能保证无级联卷回吗?
要保证无级联回卷应如何修改协议?

树形协议不能保证无级联卷回!(T12和T13都读了T10的数据,T10卷回时T12和T13也卷回)

1.5 树形协议小结

优点
树形协议保证了冲突可串行化;
同时不会产生死锁,不需要回滚;
树形协议可较早地释放锁,以减少事务间的等待时间,从而可增强调度的并发性。

缺点
树形协议不能保证事务的可恢复性;
事务不能保证不发生级联回滚;
事务有可能会给那些根本不访问的数据项加锁,从而增加了锁的开销和额外的等待时间,引起并发性降低。

image-20211022201311781

比如:一事务要处理A和J数据项,如何加锁?
不仅要求给数据项A和J加锁,
还必须给数据项B、D和H加锁!

二 死锁处理

2.1 死锁检测方法
什么是等待图,主要用途?

image-20211022201427367

image-20211022201452127
2.2 死锁的解除方法p.381
出现死锁时如何解除?
image-20211022201711693
死锁只能是发生后才想法解除吗?
可采用预防策略:
避免死锁出现!

image-20211022201833515

三 多粒度封锁协议

什么是多粒度封锁,作用? 
3.1 多粒度锁

通俗示例:教学大楼使用的管理(如仅一种锁:大楼锁/教室锁)
1)某单位租用整栋大楼用于培训,需要上大量教室锁?太繁琐
2)若仅租用部分教室而上大楼锁,剩下的没法自习?共享差

多粒度锁:
允许使用多种粒度/大小不同的锁
(不同粒度:楼,层,教室,座位)
数据库、区域、文件、记录、属性

image-20211022202325049 image-20211022202342814
什么是隐式封锁,显示封锁,意向锁? 
image-20211022203057187

意向锁

IS锁:
如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加 S锁。例如,要对某个元组加 S锁,则要首先对关系和数据库加 IS锁。

IX锁:
如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。例如,要对某个元组加 X锁,则要首先对关系和数据库加 IX锁。

SIX锁:
如果对一个数据对象加 SIX锁,表示对它加 S锁,再加IX锁,即 SIX=S+IX。例如对某个表加 SIX锁,则表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁)。

image-20211022204230223
多粒度锁加锁示例
当Ti已加锁时, Tj加锁还能成功吗? 
image-20211022204354617
3.3 多粒度封锁协议p.383
多粒度封锁协议规则及基本特点? 
image-20211022204515648
死锁是怎么产生的?应该如何预防?
posted @ 2021-11-09 16:02  Clancy_gang  阅读(57)  评论(0编辑  收藏  举报