- 1、本文档共102页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11篇 章并发控制 数据库系统概论-课件.ppt
如何保证并发事务的调度是正确的(续) 保证并发事务调度正确性的方法 封锁方法:两段锁协议(Two-Phase Locking,简称2PL) 第十一章 并发控制 11.1 并发控制概述 11.2 封锁 11.3 活锁和死锁 11.4 并发调度的可串行性 11.5 两段锁协议 11.6 封锁的粒度 11.7 小结 11.5 两段锁协议 两段锁协议的内容 1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁(封锁技术) 2. 在释放一个封锁之后,事务不再获得任何其他封锁。 两段锁协议(续) “两段”锁的含义 事务分为两个阶段 第一阶段是获得封锁,也称为扩展阶段; 第二阶段是释放封锁,也称为收缩阶段。 两段锁协议(续) 例: 事务1的封锁序列: Slock A ... Slock B ... Xlock C ... Unlock B ... Unlock A ... Unlock C; 获得封锁 释放封锁 事务2的封锁序列: Slock A ... Unlock A ... Slock B ... Xlock C ... Unlock C ... Unlock B; 事务1遵守两段锁协议,而事务2不遵守两段协议。 两段锁协议(续) T1 Slock B 读B=2 Y=B Xlock A ? ? A=Y+1 写回A=3 Unlock B Unlock A ? ? ? ? T2 ? ? ? ? Slock A 等待 等待 等待 等待 等待 Slock A 读A=3 Y=A Xlock B B=Y+1 写回B=4 Unlock B Unlock A? T1 Slock B 读B=2 Y=B Unlock B Xlock A ? ? A=Y+1 写回A=3 Unlock A ? ? ? ? ? ? ? ? ? T2 ? ? ? ? ? Slock A 等待 等待 等待 等待 Slock A 读A=3 X=A Unlock A Xlock B B=X+1 写回B=4 Unlock B? (a) 遵守两段锁协议 (b) 不遵守两段锁协议 T1 Slock B 读B=2 Y=B Unlock B Xlock A A=Y+1 写回A=3 Unlock A T2 ?? Slock A 读A=2 X=A Unlock A Xlock B 等待 Xlock B B=X+1 写回B=3 Unlock B? (c) 不遵守两段锁协议 两段锁协议(续) P302 图11.8的调度遵守两段锁协议,忽略了加锁和解锁,调度如下: R1(A)R2(C)W1(A)W2(C)R1(B)W1(B)R2(A)W2(A) 请证明这是一个可串行化调度 两段锁协议(续) 事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件 两段锁协议(续) 两段锁协议与防止死锁的一次封锁法的区别 一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议 但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁 两段锁协议(续) 图11.9 遵守两段锁协议的事务发生死锁 T1 Slock B 读B=2 ? ? Xlock A 等待 等待 T2 ? ? Slock A 读A=2 ? Xlock B 等待 如何避免活锁 采用先来先服务的策略: 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。 11.3.2 死锁 T1 T2 Xlock R1 . . . Xlock R2 等待 等待 等待 . . . Xlock R2 . . Xlock R1 等待 等待 . 解决死锁的方法 两类方法 1. 预防死锁 2. 死锁的诊断与解除 1. 死锁的预防 产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。 预防死锁的发生就是要破坏产生死锁的条件 死锁的预防(续) 预防死锁的方法 一次封锁法 顺序封锁法 (1)一次封锁法 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行 一次封锁法存在的问题:降低并发度 扩大封锁范围 将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度 一次封锁法(续) 难于事先精确确定封锁对象 数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确
文档评论(0)