5.3 分布式数据库中的死锁处理

40
5.3 5.3 分分分分分分分分分分分分 分分分分分分分分分分分分

description

5.3 分布式数据库中的死锁处理. 5 . 3 . 1全局死锁与等待图 1.活锁,死锁和全局死锁 活锁:某个事务处于永远等待状态,得不到执行的机会. 解决方法: “ 先来者先执行 ” 就是简单的排队方式.. 死锁:该集合中的每个事务都在等待该集合中另外一个事务释放它所需要的数据项上持有的锁,它才能继续执行下去,结果任何一个事务都无法继续执行 在分布式数据库中,采用封锁机制,系统有可能发生全局死锁.全局死锁涉及两个或多个站点的死锁.. 图5 . 14. - PowerPoint PPT Presentation

Transcript of 5.3 分布式数据库中的死锁处理

Page 1: 5.3 分布式数据库中的死锁处理

5.35.3 分布式数据库中的死锁处理分布式数据库中的死锁处理

Page 2: 5.3 分布式数据库中的死锁处理

55 .. 33 .. 1全局死锁与等待图1全局死锁与等待图 1.活锁,死锁和全局死锁1.活锁,死锁和全局死锁 活锁:某个事务处于永远等待状态,得不活锁:某个事务处于永远等待状态,得不

到执行的机会.到执行的机会. 解决方法:“先来者先执行”就是简单的解决方法:“先来者先执行”就是简单的

排队方式.排队方式.

Page 3: 5.3 分布式数据库中的死锁处理

死锁:该集合中的每个事务都在等待该集死锁:该集合中的每个事务都在等待该集合中另外一个事务释放它所需要的数据项合中另外一个事务释放它所需要的数据项上持有的锁,它才能继续执行下去,结果上持有的锁,它才能继续执行下去,结果任何一个事务都无法继续执行任何一个事务都无法继续执行

在分布式数据库中,采用封锁机制,系统在分布式数据库中,采用封锁机制,系统有可能发生全局死锁.全局死锁涉及两个有可能发生全局死锁.全局死锁涉及两个或多个站点的死锁.或多个站点的死锁.

Page 4: 5.3 分布式数据库中的死锁处理

图5图5 .. 1414

Page 5: 5.3 分布式数据库中的死锁处理

分布式数据库中的数据冗余也会增加更新分布式数据库中的数据冗余也会增加更新数据时引起死锁的机会.因为更新时需要数据时引起死锁的机会.因为更新时需要对全部副本加拒绝锁,有副本的每个站点对全部副本加拒绝锁,有副本的每个站点上都有可能等待另一个事务释放锁,但每上都有可能等待另一个事务释放锁,但每个事务只有它全部完成后才能释放拒绝锁,个事务只有它全部完成后才能释放拒绝锁,因此造成全局死锁.因此造成全局死锁.

Page 6: 5.3 分布式数据库中的死锁处理

图5图5 .. 1515

Page 7: 5.3 分布式数据库中的死锁处理

2 等待图(2 等待图( WFCWFC )) 等待图是一种用来表示事务之间相互等待等待图是一种用来表示事务之间相互等待

关系的有向图,其中指出哪一个事务在等关系的有向图,其中指出哪一个事务在等待其他哪个或哪些事务释放锁.待其他哪个或哪些事务释放锁.

图中节点表示事务,边表示等待关系,箭图中节点表示事务,边表示等待关系,箭头方向就是等待方向.头方向就是等待方向.

如下图是5如下图是5 .. 15的等待图15的等待图

Page 8: 5.3 分布式数据库中的死锁处理

图5图5 .. 1616

Page 9: 5.3 分布式数据库中的死锁处理

全局等待图(全局等待图( GWFCGWFC ):): 图5图5 .. 1717

Page 10: 5.3 分布式数据库中的死锁处理

55 .. 33 .. 2死锁的预防方法2死锁的预防方法 思想:当有发生死锁危险时,就终止并思想:当有发生死锁危险时,就终止并

重新启动其中一个事务或让该事务等待,重新启动其中一个事务或让该事务等待,但如果允许有等待的话,则决不可能发但如果允许有等待的话,则决不可能发生死锁.生死锁.

因为这种方法不会发生死锁,所以不需因为这种方法不会发生死锁,所以不需要进行死锁的检测和恢复.要进行死锁的检测和恢复.

Page 11: 5.3 分布式数据库中的死锁处理

死锁预防是这样进行的:形成死锁的原因死锁预防是这样进行的:形成死锁的原因是多个事务并发执行,互相等待另一事务是多个事务并发执行,互相等待另一事务所持有的锁,且形成等待回路引起的.如所持有的锁,且形成等待回路引起的.如果事务果事务 T1T1 请求一资源,而该资源被另一事请求一资源,而该资源被另一事务务 T2T2 所持有时,则进行一次预防性测试.所持有时,则进行一次预防性测试.若测试结果有死锁的危险时,或不让若测试结果有死锁的危险时,或不让 T1T1 进进入等待状态,并重新启动入等待状态,并重新启动 T1T1 或终止并重新或终止并重新启动启动 T2T2 ..

Page 12: 5.3 分布式数据库中的死锁处理

预防性测试的一般方法是把事务排序.预防性测试的一般方法是把事务排序. 如按它们标识符的词典顺序排序,或按它们的如按它们标识符的词典顺序排序,或按它们的

开始时间排序等.开始时间排序等. 预防死锁的方法有两种(按事务开始时间)预防死锁的方法有两种(按事务开始时间) 1非占先权(排队在先者可能失去优先)方法,1非占先权(排队在先者可能失去优先)方法,

也叫等待-死亡模式.也叫等待-死亡模式. 非占先权的理论基础是:最好总是重新启动较非占先权的理论基础是:最好总是重新启动较

年轻的事务.允许年老的事务等待已持有资源年轻的事务.允许年老的事务等待已持有资源的年轻事务,但不允许年轻的事务去等待年老的年轻事务,但不允许年轻的事务去等待年老的事务.的事务.

Page 13: 5.3 分布式数据库中的死锁处理

2占先权(排队在先者绝对优先)方法,2占先权(排队在先者绝对优先)方法,也叫伤害-等待模式.也叫伤害-等待模式.

占先权的理论基础是:因为仍要求终止较占先权的理论基础是:因为仍要求终止较年轻的事务,但不允许年老的事务绝对优年轻的事务,但不允许年老的事务绝对优于年轻的事务,因而只有年轻的等待年老于年轻的事务,因而只有年轻的等待年老的.的.

这两种方法都不会发生死锁.这两种方法都不会发生死锁.

Page 14: 5.3 分布式数据库中的死锁处理

55 .. 33 .. 3死锁的检测和解决方法3死锁的检测和解决方法 11 .. 死锁的检测和解决的一般方法死锁的检测和解决的一般方法 检测是通过对全局等待图中的回路的形成进行研检测是通过对全局等待图中的回路的形成进行研

究来实现的.究来实现的. 如果系统处于死锁状态,就必须撤消一些引起死如果系统处于死锁状态,就必须撤消一些引起死

锁的事务.选择撤消哪个事务称为受害者选择.锁的事务.选择撤消哪个事务称为受害者选择.通过选择一个或多个受害者事务,这些事务或者通过选择一个或多个受害者事务,这些事务或者被优先执行或被撤消,以打破被优先执行或被撤消,以打破 GWFGGWFG 中的回路.中的回路.

Page 15: 5.3 分布式数据库中的死锁处理

选择最小总开销来打破死锁很困难,以下选择最小总开销来打破死锁很困难,以下是可以影响这一选择的因素:是可以影响这一选择的因素:

11 ::对事务已经投入了大量努力.对事务已经投入了大量努力. 22 ::撤消事务的开销.撤消事务的开销. 33 :: 调度器力图避免撤消那些几乎要完成的调度器力图避免撤消那些几乎要完成的

事务.事务. 44 :: 包含该事务的回路数目.包含该事务的回路数目.

Page 16: 5.3 分布式数据库中的死锁处理

22 .. 分布式死锁检测和解决办法分布式死锁检测和解决办法 检测有三种基本方法:集中式,层次式及分布式死锁检测有三种基本方法:集中式,层次式及分布式死锁

检测法.检测法. (1)集中式死锁检测法:某个站点上的锁管理器被(1)集中式死锁检测法:某个站点上的锁管理器被

指定为整个系统的死锁检测器,其他每个站点上的锁指定为整个系统的死锁检测器,其他每个站点上的锁管理器周期性的将它的管理器周期性的将它的 LWFGLWFG传给系统的死锁检测器,传给系统的死锁检测器,然后由系统的死锁检测器形成然后由系统的死锁检测器形成 GWFGGWFG 并在其中查找回并在其中查找回路.或者,每个站点上的锁管理器周期性把一张记录路.或者,每个站点上的锁管理器周期性把一张记录本站点上事务开始时间,对锁的持有,请求情况变化本站点上事务开始时间,对锁的持有,请求情况变化的动态表,发给负责处理封锁的站点.由它维护一张的动态表,发给负责处理封锁的站点.由它维护一张全局封锁动态表,形成全局封锁动态表,形成 GWFGGWFG 并在其中查找回路.如并在其中查找回路.如果果 GWFGGWFG 中至少有一个回路,它将选择一个或多个事中至少有一个回路,它将选择一个或多个事务,把它们撤消并恢复,释放被占资源,使其他事务务,把它们撤消并恢复,释放被占资源,使其他事务继续进行.继续进行.

这种方法很简单,但是传输开销较高.这种方法很简单,但是传输开销较高.

Page 17: 5.3 分布式数据库中的死锁处理

(2)层次式死锁检测法:以层次方式组织成员数据库(2)层次式死锁检测法:以层次方式组织成员数据库管理系统中的死锁检测器.按下述步骤进行死锁检测:管理系统中的死锁检测器.按下述步骤进行死锁检测:

11 :: 树叶是各站点的死锁局部检测器,它们在本站点建立树叶是各站点的死锁局部检测器,它们在本站点建立局部等待图.局部等待图.

22 ::本站点的死锁检测器找出本站点的本站点的死锁检测器找出本站点的 LWFGLWFG 中的任何回中的任何回路,并把有关潜在全局回路的信息发送给层次结构中的路,并把有关潜在全局回路的信息发送给层次结构中的紧挨的上一层死锁检测器紧挨的上一层死锁检测器

33 ::每个非本地死锁检测器只对它所涉及的下层进行死锁每个非本地死锁检测器只对它所涉及的下层进行死锁检测器,合并这些接收到的有关潜在全局回路信息,并检测器,合并这些接收到的有关潜在全局回路信息,并找出任何回路.找出任何回路.

44 ::如果还有上层死锁检测器,将经过简化的有关潜在全如果还有上层死锁检测器,将经过简化的有关潜在全局回路信息发给它的上一层死锁检测器,由上一层死锁局回路信息发给它的上一层死锁检测器,由上一层死锁检测器再进行合并,找出任何全局回路.这样逐层进行检测器再进行合并,找出任何全局回路.这样逐层进行检查,直到最高层.检查,直到最高层.

Page 18: 5.3 分布式数据库中的死锁处理

图5图5 .. 1818

Page 19: 5.3 分布式数据库中的死锁处理

(3)及分布式死锁检测法:赋予每个站点相同的检测(3)及分布式死锁检测法:赋予每个站点相同的检测死锁职责.简单介绍一下死锁职责.简单介绍一下 System RSystem R系统中使用的方法,系统中使用的方法,它对每一站点的它对每一站点的 LWFGLWFG 的形成更新如下:的形成更新如下:

11 :: 由于每一站点接收从其他站点传来的可能的死锁回由于每一站点接收从其他站点传来的可能的死锁回路,因此向自己的局部路,因此向自己的局部 WFGWFG 增加一些边.增加一些边.

22 ::在站点的在站点的 LWFGLWFG 中,被增加的用于表示本地事务正中,被增加的用于表示本地事务正在等待其他站点事务的边,同用于表示远程事务正在等在等待其他站点事务的边,同用于表示远程事务正在等待本站点事务的边相连接,该节点称为外部节点(待本站点事务的边相连接,该节点称为外部节点( EXEX)) ..

向谁传送信息:不知道被涉及的哪些站点时,可以向系向谁传送信息:不知道被涉及的哪些站点时,可以向系统中所有站点传输.如果知道死锁回路的头还是尾就可统中所有站点传输.如果知道死锁回路的头还是尾就可以沿着回路中的站点向前或后传送.接收到信息的站点以沿着回路中的站点向前或后传送.接收到信息的站点随即根据前面讨论的方法更新其随即根据前面讨论的方法更新其 LWFGLWFG ,并检查死锁.,并检查死锁.

Page 20: 5.3 分布式数据库中的死锁处理

55 .. 4时标技术4时标技术 55 .. 44 .. 1基于时标的并发控制方法1基于时标的并发控制方法 1基本概念1基本概念 基于时标的并发控制方法选择一个事先的串行次基于时标的并发控制方法选择一个事先的串行次

序依次执行事务.为建立次序,在每个事务初始序依次执行事务.为建立次序,在每个事务初始化时,事务管理器将给每个事务分配一个在整个化时,事务管理器将给每个事务分配一个在整个系统中唯一的时标.系统中唯一的时标.

时标:是用来唯一识别每个事务并允许排序的标时标:是用来唯一识别每个事务并允许排序的标识符.特性:唯一性和单调性识符.特性:唯一性和单调性

时标由两部分组成:时标由两部分组成:    <本地计数器值,站点标识符>   <本地计数器值,站点标识符>

Page 21: 5.3 分布式数据库中的死锁处理

采用时标方法的思想是:给每个事务赋一采用时标方法的思想是:给每个事务赋一个唯一的时标,事务的执行等效于按时标个唯一的时标,事务的执行等效于按时标次序串行执行.如果发生冲突,是通过撤次序串行执行.如果发生冲突,是通过撤消并重新启动一个事务来解决的.事务重消并重新启动一个事务来解决的.事务重新启动时,则赋予新的时标.这个方法的新启动时,则赋予新的时标.这个方法的优点是无死锁,不必设置锁.封锁和死锁优点是无死锁,不必设置锁.封锁和死锁检测所引起的通信开锁也避免了.但这个检测所引起的通信开锁也避免了.但这个方法要求时标在全系统中是唯一的.方法要求时标在全系统中是唯一的.

Page 22: 5.3 分布式数据库中的死锁处理

2全局唯一时标的形成和调整2全局唯一时标的形成和调整 图5图5 .. 2020

Page 23: 5.3 分布式数据库中的死锁处理

55 .. 44 .. 2基本时标法2基本时标法 基本时标法使用下述规则:基本时标法使用下述规则: 1)每个事务在本站点开始赋予一个全局唯一时标.1)每个事务在本站点开始赋予一个全局唯一时标. 2)在事务结束之前,不对数据库进行物理更新.2)在事务结束之前,不对数据库进行物理更新. 3)事务的每个读操作或写操作都具有该事务的时标3)事务的每个读操作或写操作都具有该事务的时标 4)对于数据库中的每个数据4)对于数据库中的每个数据 XX,记录对其进行读操,记录对其进行读操作和写操作的最大时标,分配记为作和写操作的最大时标,分配记为 RTM(X)RTM(X)和和 WTM(X)WTM(X)..

5)如果事务被重新启动,则被赋予新的时标.5)如果事务被重新启动,则被赋予新的时标.

Page 24: 5.3 分布式数据库中的死锁处理

基本时标法的执行过程基本时标法的执行过程 1)设1)设 read_TSread_TS是对数据是对数据 XX进行读操作的时标,如果进行读操作的时标,如果 rearead_TS<WTM(X),d_TS<WTM(X), 则拒绝该操作,并使发出该操作的事务用则拒绝该操作,并使发出该操作的事务用新时标重新启动;否则执行该操作,并把新时标重新启动;否则执行该操作,并把 RTM(X)RTM(X) 置为置为 mmax(RTM(x),read_TS)ax(RTM(x),read_TS)

2)2) 设设 write_TSwrite_TS是对数据是对数据 XX进行写操作的时标,如果进行写操作的时标,如果 writwrite_TS <RTM(X)e_TS <RTM(X) 或或 TS<WTM(X),TS<WTM(X), 则拒绝这个写操作,并使则拒绝这个写操作,并使发出该操作的事务用新时标重新启动;否则执行这个写操发出该操作的事务用新时标重新启动;否则执行这个写操作,并把作,并把 WTM(X)WTM(X) 置为置为 max(WTM(x),write_TS)max(WTM(x),write_TS)

基本时标法的特点是不会发生死锁,任何一个事务都不会基本时标法的特点是不会发生死锁,任何一个事务都不会阻塞,如果某一操作不能执行就重新启动,而不是等待.阻塞,如果某一操作不能执行就重新启动,而不是等待.高的重启动次数是这个方法的缺点.高的重启动次数是这个方法的缺点.

Page 25: 5.3 分布式数据库中的死锁处理

55 .. 44 .. 3保守时标法3保守时标法 保守时标法是一种消除重启动的方法,通过缓冲年轻保守时标法是一种消除重启动的方法,通过缓冲年轻

的操作,直至年长的操作执行完成,因此操作不会被的操作,直至年长的操作执行完成,因此操作不会被拒绝,事务也绝对不被重启动拒绝,事务也绝对不被重启动

1保守时标法的规则1保守时标法的规则 1)每个事务只在一个站点执行,它不激活远程的程1)每个事务只在一个站点执行,它不激活远程的程

序,仅仅能向远程站点发出读或写请求序,仅仅能向远程站点发出读或写请求 2)每个站点必须按时标时间的顺序发送读/写数据2)每个站点必须按时标时间的顺序发送读/写数据

的请求,在传输中也不会改变这个顺序,以保证各站的请求,在传输中也不会改变这个顺序,以保证各站点能够按时标顺序接收来自不同站点的全部读/写请点能够按时标顺序接收来自不同站点的全部读/写请求求

3)每个站点都为其他各个站点发来的读/写操作开3)每个站点都为其他各个站点发来的读/写操作开辟一个缓冲区,把接收到的读/写操作分别保存在相辟一个缓冲区,把接收到的读/写操作分别保存在相应的缓冲区中.应的缓冲区中.

Page 26: 5.3 分布式数据库中的死锁处理

2保守时标法的执行步骤2保守时标法的执行步骤 站点1 站点2 站点3…… 站点站点1 站点2 站点3…… 站点 nn R11 R21 R31 ……. Rn1R11 R21 R31 ……. Rn1 R12 R22 R32R12 R22 R32 R13 R23R13 R23 R24R24 W11 W21 W31 …….. Wn1W11 W21 W31 …….. Wn1 W22 W32 ….… Wn2W22 W32 ….… Wn2 W23W23

Page 27: 5.3 分布式数据库中的死锁处理

此时按如下步骤执行:此时按如下步骤执行: 1)设1)设 RT=min(Rij),WT=min(Wij)RT=min(Rij),WT=min(Wij) 2)按下法处理在缓冲区队列里的2)按下法处理在缓冲区队列里的 RijRij和和 WijWij 11 :: 扫描扫描 RR队列,若各队列中存在队列,若各队列中存在 (Rij)<WT(Rij)<WT 的的 RijRij 按顺序执行它们,执行完成从队列中把它们去掉.按顺序执行它们,执行完成从队列中把它们去掉. 22 :: 扫描扫描 WW 队列,若各队列中存在队列,若各队列中存在 (Wij)<RT(Wij)<RT 的的 WijWij 按顺序执行它们,执行完成从队列中把它们去掉按顺序执行它们,执行完成从队列中把它们去掉 .. 33 ::更新:更新: RT=min(Rij),WT=min(Wij).RT=min(Rij),WT=min(Wij). 此时的此时的 RijRij和和 WijWij 已是剩余已是剩余 的 的 RijRij和和 WijWij 了了 44 ::重复上述2.3步,直到没有满足条件的操作,或者:重复上述2.3步,直到没有满足条件的操作,或者: 1若某个或某些1若某个或某些 RR队列为空时,队列为空时, RT=0;RT=0; 2若某个或某些2若某个或某些 WW 队列为空时,队列为空时, WT=0;WT=0; 继续接收各站点发送来的读/写操作.回到上述情形,若其各继续接收各站点发送来的读/写操作.回到上述情形,若其各 个缓冲区队列有都不空,仍按上面步骤继续.个缓冲区队列有都不空,仍按上面步骤继续.

Page 28: 5.3 分布式数据库中的死锁处理

3存在问题和解决办法3存在问题和解决办法 1)如果一个站点从不向某个别的站点发送操作的话,那么1)如果一个站点从不向某个别的站点发送操作的话,那么

执行中假定就不符合,操作就无法执行.执行中假定就不符合,操作就无法执行. 这个问题的解决办法是要求对无实际读/写请求的每个站点,这个问题的解决办法是要求对无实际读/写请求的每个站点,

要周期性的发送带有时标的“空”操作,或由被阻断的站点要周期性的发送带有时标的“空”操作,或由被阻断的站点请求无实际读/写请求的每个站点向它发送带时标的“空”请求无实际读/写请求的每个站点向它发送带时标的“空”操作.空操作是指只传送时标信息而不是真正的操作.操作.空操作是指只传送时标信息而不是真正的操作.

2)该方法要求网络上所有站点都连通,这在大型系统中难2)该方法要求网络上所有站点都连通,这在大型系统中难以做到.为避免不必要的通信,可对无实际读/写请求的每以做到.为避免不必要的通信,可对无实际读/写请求的每个站点,发送一个时标为很大的空操作.个站点,发送一个时标为很大的空操作.

3)该方法过分保守,一律按时标顺序执行3)该方法过分保守,一律按时标顺序执行 RR和和 WW ,其中,其中包括了不会冲突的操作,也被缓冲起来等同处理.包括了不会冲突的操作,也被缓冲起来等同处理.

Page 29: 5.3 分布式数据库中的死锁处理

55 .. 5并发控制的多版本技术5并发控制的多版本技术 并发控制的多版本技术:保存了已更新数据项的并发控制的多版本技术:保存了已更新数据项的旧值,维护一个数据项的多个版本值.旧值,维护一个数据项的多个版本值.

它的思想:通过读一个数据项的一个较老的版本它的思想:通过读一个数据项的一个较老的版本来维护可串行性,使得系统可以接受在其他技术来维护可串行性,使得系统可以接受在其他技术中被拒绝的一些读操作.当某事务写一个数据项中被拒绝的一些读操作.当某事务写一个数据项时,它写入了一个新版本,但是该数据项的老版时,它写入了一个新版本,但是该数据项的老版本仍然被保存.本仍然被保存.

我们讨论其中的两种模式:一种是基于时间戳排我们讨论其中的两种模式:一种是基于时间戳排序,另一种则是基于两阶段封锁.序,另一种则是基于两阶段封锁.

Page 30: 5.3 分布式数据库中的死锁处理

55 .. 55 .. 1基于时间戳排序的多版本技术1基于时间戳排序的多版本技术 在这种方法中,每个数据项在这种方法中,每个数据项 XX 都保留了多都保留了多

个版本个版本 x1,x2……Xk.x1,x2……Xk. 对于每个版本系统保对于每个版本系统保存版本存版本 XiXi的值和以下两种时间戳:的值和以下两种时间戳:

1)1) read_TS(Xi):Xiread_TS(Xi):Xi 的读时间戳,所有读的读时间戳,所有读取版本取版本 XiXi的事务的时间戳中最大的一个.的事务的时间戳中最大的一个.

2)2) write_TS(Xi):Xiwrite_TS(Xi):Xi的写时间戳,它是写的写时间戳,它是写入版本入版本 XiXi 值的事务的时间戳.值的事务的时间戳.

Page 31: 5.3 分布式数据库中的死锁处理

两条规则:两条规则: 1)如果事务1)如果事务 TT 发布一个发布一个 write_item(X)write_item(X) 操作,并且操作,并且 XX的的版本版本 ii 具有具有 XX所有版本中最高的所有版本中最高的 write_TS(Xi)write_TS(Xi) ,同时,同时 writwrite_TS(Xi)e_TS(Xi) <=<= TS(T) TS(T) 且且 read_TS(Xi)>TS(T)read_TS(Xi)>TS(T),那么撤消并,那么撤消并回滚回滚 TT;否则创建;否则创建 XX的一个新版本的一个新版本 XjXj,并且令,并且令 read_TSread_TS(Xj)=write_TS(Xj)=TS(T).(Xj)=write_TS(Xj)=TS(T).

2)如果事务2)如果事务 TT 发布一个发布一个 read_item(X)read_item(X) 操作,并且操作,并且 XX的的版本版本 ii 具有具有 XX所有版本中最高的所有版本中最高的 write_TS(Xi)write_TS(Xi) ,同时,同时 writwrite_TS(Xi)e_TS(Xi) <=<= TS(T) TS(T) 那么那么 ,,把把 XiXi的值返回给事务的值返回给事务 TT ,并,并且将且将 read_TS(Xi)read_TS(Xi) 的值置为的值置为 TS(T) TS(T) 和当前和当前 read_TS(Xi)read_TS(Xi) 中中较大的一个.较大的一个.

Page 32: 5.3 分布式数据库中的死锁处理

55 .. 55 .. 2采用验证锁的多版本两阶段封锁2采用验证锁的多版本两阶段封锁 在这种封锁模式中,每个数据项有三种锁:读,在这种封锁模式中,每个数据项有三种锁:读,写和验证.因此对于一个数据项写和验证.因此对于一个数据项 XX,, LOCK(X)LOCK(X)的的状态可以是以下四种:读封锁,写封锁,验证封状态可以是以下四种:读封锁,写封锁,验证封锁,未封锁锁,未封锁

在只有读和写的封锁模式图5在只有读和写的封锁模式图5 .. 21(21( aa)所示)所示锁的相容性锁的相容性 ..

采用验证锁的多版本两阶段封锁模式图5采用验证锁的多版本两阶段封锁模式图5 .. 2121(( bb)所示锁的相容性)所示锁的相容性 ..

Page 33: 5.3 分布式数据库中的死锁处理

读 写 读 写 验证读 写 读 写 验证读 是 否 读 是 是 否读 是 否 读 是 是 否写 否 否 写 是 否 否写 否 否 写 是 否 否 验证 否 否 否验证 否 否 否

Page 34: 5.3 分布式数据库中的死锁处理

5.65.6 并发控制的乐观方法并发控制的乐观方法 基本思想:对于冲突操作不像悲观方法那样采取基本思想:对于冲突操作不像悲观方法那样采取挂起或拒绝的方法,而是让一个事务执行直到完挂起或拒绝的方法,而是让一个事务执行直到完成.成.

乐观方法基于如下假设:冲突的事务是少数(5乐观方法基于如下假设:冲突的事务是少数(5%),大多数事务是可以不受干扰的执行完毕.%),大多数事务是可以不受干扰的执行完毕.因此在事务执行过程中,事务都是先对欲操作的因此在事务执行过程中,事务都是先对欲操作的数据项的本地局部副本进行操作,执行完毕后再数据项的本地局部副本进行操作,执行完毕后再进行检验.当不曾发生过冲突时,就把该本地局进行检验.当不曾发生过冲突时,就把该本地局部副本全局化;若发生过冲突,则回退该事务并部副本全局化;若发生过冲突,则回退该事务并作为新事务重新启动.作为新事务重新启动.

Page 35: 5.3 分布式数据库中的死锁处理
Page 36: 5.3 分布式数据库中的死锁处理

1)读/计算阶段:事务从数据库中读数据,1)读/计算阶段:事务从数据库中读数据,进行计算,并为写集合中的数据项确定新值,进行计算,并为写集合中的数据项确定新值,但这些值暂不写入数据库.但这些值暂不写入数据库.

读阶段末产生一个更新表包括1读集的数据项,读阶段末产生一个更新表包括1读集的数据项,带有自身时标;2写集数据项的新值3该事务带有自身时标;2写集数据项的新值3该事务自身的时标自身的时标

2)验证阶段:检测事务对数据库的更新是否2)验证阶段:检测事务对数据库的更新是否失去相容性,确定如果将事务的更新应用于数失去相容性,确定如果将事务的更新应用于数据库,不会违反可串行性.据库,不会违反可串行性.

表决规则:更新表读集中的每个数据项的时标表决规则:更新表读集中的每个数据项的时标和它的本地数据库中存在的对应数据项的时标和它的本地数据库中存在的对应数据项的时标进行比较,如果它们全部相等,则该站点投肯进行比较,如果它们全部相等,则该站点投肯定票,否则投否定票.定票,否则投否定票.

Page 37: 5.3 分布式数据库中的死锁处理

这里没有考虑更新表挂起的情况.即一个更新表这里没有考虑更新表挂起的情况.即一个更新表从已经表决的时刻算起,到它收到来自源站点的从已经表决的时刻算起,到它收到来自源站点的最后决定为止,这段时间称为该更新表在这个站最后决定为止,这段时间称为该更新表在这个站点上未表决(挂起)。如果同一站点上的两个更点上未表决(挂起)。如果同一站点上的两个更新表新表 UU和和 U’U’,且两个更新表都更新同一数据项。,且两个更新表都更新同一数据项。当当 UU表到达时,表到达时, U’U’表还未处理或仍处于未表决表还未处理或仍处于未表决在状态,而且在状态,而且 UU和和 U’U’有冲突,即有冲突,即 U’U’的执行结的执行结果会引起与果会引起与 UU表读集相对应的数据项时标的改变。表读集相对应的数据项时标的改变。这时就需要对上述表决规则进行扩充。这时就需要对上述表决规则进行扩充。

Page 38: 5.3 分布式数据库中的死锁处理

扩充后的表决规则如下:扩充后的表决规则如下: 11 ::比较比较 UU表的读集中的数据项的时标与数据库中对应数表的读集中的数据项的时标与数据库中对应数

据据 项的时标;项的时标; 22 ::如果不等投否定票如果不等投否定票 33 ::如果相等,若存在一个与如果相等,若存在一个与 UU表有冲突操作的未决更新表有冲突操作的未决更新

表表 U‘U‘,且,且 U’U’的时标大于的时标大于 UU的时标,则投否定票的时标,则投否定票 44 ::如果相等,若存在一个与如果相等,若存在一个与 UU表有冲突操作的未决更新表有冲突操作的未决更新

表表 U‘U‘,且,且 U’U’的时标小于的时标小于 UU的时标,则推迟表决的时标,则推迟表决 55 ::如果相等,但不存在未决的更新表,则投肯定票如果相等,但不存在未决的更新表,则投肯定票

Page 39: 5.3 分布式数据库中的死锁处理

3)写阶段如验证阶段获得肯定结果,则3)写阶段如验证阶段获得肯定结果,则把数据更新应用于数据库,对数据库进行把数据更新应用于数据库,对数据库进行更新,否则,忽略所有更新,并重新开始更新,否则,忽略所有更新,并重新开始该事务该事务

Page 40: 5.3 分布式数据库中的死锁处理

谢谢!谢谢!