收藏 分享(赏)

Two-Phase Locking.docx

上传人:hwpkd79526 文档编号:6782792 上传时间:2019-04-22 格式:DOCX 页数:4 大小:22.90KB
下载 相关 举报
Two-Phase Locking.docx_第1页
第1页 / 共4页
Two-Phase Locking.docx_第2页
第2页 / 共4页
Two-Phase Locking.docx_第3页
第3页 / 共4页
Two-Phase Locking.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、Two-Phase Locking简介:Two-Phase Locking,简称是 2PL,中文通常被翻译为二项锁,是管理事务调度( Transaction Scheduling)的一项重要技术概念,主要应用场景为支持事务的存储或计算系统中,如Mysql 数据库中 innodb 引擎对事务调度即使用 2PL 技术。2PL 本身的技术概念比较简单,解释起来不难,但是要吃透它,就涉及到很多外围的技术概念,为了能够更好地理解这个技术,先做一些技术知识的铺垫说明。知识预备:几个系统能力特征描述概念。(1) Recoverability(可恢复性):即系统恢复到之前正常运行状态的能力。其中更多地是强调数

2、据的可恢复性,即数据与宕机或重启前是否完全一致。对于一些简单系统而言,可以通过把数据定期全部 dump 出来,恢复时全部 reload 这样的方法,Recoverability就能够满足要求(由于 dump 的时间间隔,并不能完全达到恢复成最后运行时刻的状态) 。要保证 Recoverability 常用方法是基于 redo-log(恢复日志/重写日志) ,重启时依次读取 redo-log 中的操作记录,从而恢复整体系统数据。要做到这点,需要有一个前提,就是事务执行的过程可以完全被依次操作 redo-log 的记录进行代替,这就引出另外一个概念 Serializability(可串行化) 。(

3、2) Serializability(可串行化):也有称为:冲突可串、可串性等,简单来讲,即一堆事务的调度执行(可能是并行的调度) ,可以等价为一个串行的调度(下一个事务在上一个事务的最后一个操作完成之后开始) 。这么讲非常抽象,由于 Serializabilty 是一个非常理论性质的定义,在很多数据库相关的教科书中出现较多,而且对其定义也有非常数学化的解释,这里我很难避免数学方式的描述,但尽量描述的通俗一些。Serializability 的概念建立在 Conflct(冲突)的概念之上,下面基于一个简单例子进行说明。时间顺序 Transaction(1) Transaction(2)Time

4、0 (假设 A=10;B=20)Time1 Read Variable ATime2 Write Variable A=30Time3 Write Variable B=30Time4 Write Variable B=A*100Result A=30;B=1000上面描述了两个事务的一种调度过程,其中事务 1 和事务 2 各自都包含两个操作。其中对同一个变量的操作,称为冲突。因此事务 1 中 Read A 与事务 2 中 Write A 是冲突,事务 1 中 Write B 与事务 2 中 Write B 也是冲突。当同一时间遇到冲突操作时,一个执行,一个等待其执行完成,从而使冲突在不同的时

5、间段执行(实际情况是通过 Lock 方式) ,如果一个系统允许以上例子的调度方式,从冲突执行顺序上看,是事务 1事务 2事务 1,那么可能的两种串行化方式,都无法得到最后的数据。时间顺序 串行方案 1 串行方案 2Time0 (假设 A=10;B=20)Time1(开始执行事务 1) Read Variable A Write Variable A=30Time2 Write Variable B=A*100 Write Variable B=30Time3(开始执行事务 2) Write Variable A=30 Read Variable ATime4 Write Variable B=

6、30 Write Variable B=A*100Result A=30;B=30 A=30;B=3000串行化在数学上的定义,即为事务在冲突执行顺序上无环。实例中事务 1事务 2事务 1 则出现环。(3) Strictness(严格性) :简单而言,即数据读取的变化保证严格与事务执行的顺序一致。为什么要提出 Strictness 的问题,在数据系统中通常会由于事务调度问题,引起几类数据问题:A. 更新丢失问题时间顺序 Transaction(1) Transaction(2)Time0 (假设 A=10)Time1 Read Variable ATime2 Read Variable ATi

7、me3 Write Variable A=A*100Time4 Write Variable A=A*10Result A=100事务 1 的操作完全丢失,因为事务 2 不是基于事务 1 的结果进行操作。B. 不可重复读问题时间顺序 Transaction(1) Transaction(2)Time0 (假设 A=10)Time1 Read Variable ATime2 Read Variable A(10 )Time3 Write Variable A=A*100Time4 Read Variable A(100)C. 读脏数据问题时间顺序 Transaction(1) Transacti

8、on(2)Time0 (假设 A=10)Time1 Write Variable A=100Time2 Read Variable A(100)Time3 Aborts and RollBack(4) Cascadinglessness(避免级联回滚) :也称为 Avoid Cascading Aborts,ACA。当有(3) 中描述的事务 1 出现 Abort,但数据已经被其它事务读取,那么不仅要事务 1 回滚,相关联的事务(事务 2)也要进行回滚,那么这就引起了 Cascading Aborts 问题。Cascadinglessness 是描述系统即使出现回滚,也不会级联回滚。(5) Co

9、mmitment Ordering(事务提交有序):也称为 Commit Ordering,CO。这是一个技术方法概念,其实实现方式有很多种,比如后面基于 2PL 的一种变种也能达到这种效果。但 CO 的主要目的,其实是为了 Serializability,所以把 CO 定位成一种方法,而不是系统的一种特征,更为合适一些。2PL:经过对预备知识的了解,我们可以梳理出一个简单的逻辑线 Serializability Recoverability,而 Recoverability 可以做很多的事情,比如系统备份、系统重启恢复、系统灾难恢复等。所以如何能够实现 Serializability 便成为

10、了技术焦点,这也就引出了对于 2PL 研究的意义。Two-Phase Locking,解释起来其实很简单,就是一个事务,对于所有的加锁和解锁分成两个前后的步骤。(1) Expanding Phase(也有的称为 Growing Phase):在这个阶段,只能加锁,不能解锁;(2) Shrinking Phase:在这个阶段,只能解锁,不能加锁。 (关于 Shrinking Phase 有个概念容易迷糊,那就是 2PL 中并没有强调 Shrinking Phase 究竟什么时候开始,很多人容易误解为 Expanding Phase 完成,事务就算完成 commit,其实不是这样,两者不是一个概念

11、,但 expanding phase 肯定要早于事务的 commit)如果所有要调度的事务,都按照 Two-Phase Locking 的方式来进行,即满足 Two-Phase Locking Protocol,那么可以保证所有事务的 Serializability。这个是可以证明的,利用反证法简单说明一下:如果一组调度的事务不能串行化,就表示执行顺序有环(Serializability 的定义) ,假设有 3 个事务,T1/T2/T3,都满足 2PL,但执行顺序为 T1-T2-T3-T1。那么就表示 T1 分成两个时间阶段来执行,并且在 T1-T2 是要解锁,在 T3-T1 是要加锁,这个与

12、 T1 满足 2PL 矛盾。证毕。S2PL:2PL 非常简单,但有 2 个比较致命的问题,从而导致在实体项目和系统中,使用较少,最多只是学术上的研究。问题 1 就是并没有保证 Strictness;问题 2 就是需要系统能够检测到 Phase-1 结束的时间,而这个在实际系统中是比较难做到的。针对 Strictness 的解决,就引出了 Strict Two-Phase Locking(S2PL ) ,其在 2PL 的概念之上,新增一个要求,那就是写锁(write lock,具体是什么,由于概念比较简单,就不说了,跟 read lock 呼应)需要在事务 commit 或者 abort 后才能

13、释放,而读锁则不用。通过这个方式,可以保证 Strictness。SS2PL:S2PL 由于比较难于检测到 Phase-1 结束的时间,这个是一个应用级别的问题,所以阻碍了 S2PL 在实际系统中的应用。针对这个问题,就引出了 Strong Strict Two-Phase Locking(SS2PL) ,其在 2PL 的概念之上,将读锁和写锁都要求在事务 commit 或者abort 后才释放,这样就不用去检测 Phase-1 的结束时间,整个 Phase-2 由于锁基本统一时间释放,因此可以认为没有 Phase-2。对于 SS2PL 很多会有疑问,相对与 S2PL 而言,SS2PL 把读锁延迟释放,并发调度能力上(concurrency)不是会有影响么?从实际应用上看,这个影响非常小,相对于其带来的好处,可以忽略。当然 SS2PL 相对 S2PL 还有一个概念上的优势,那就是可以实现Commitment Ordering,但前面也提过,CO 的主要意义也是为了 Serializability,但 S2PL本身就支持 Serializability,所以 CO 的意义也就不大了。相关内容引用于 weibo: 程序设计之路 ,以及 http:/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报