并发调度的可串行性:可串行化调度、冲突可串行化调度、两段锁协议

内容主线:

并发调度的可串行性

        DBMS对并发事务不固的调度可能会产生不同的结果,有正确的,有不正确的。显然串行调度是正确的。

        执行结果等价于串行调度的调度也是正确的,这样的调度叫做可串行化调度

        1、可串行化调度

        定义:

        多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化(Serializable)的调度。

        可串行性(Serializability):

        并发事务正确调度的准则。按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确的调度。 

        例:

        现在有两个事务,分别包含下列操作:
        事务T1:读B;A=B+1;写回A
        事务T2:读A;B=A+1;写回B
        设A,B的初值均为2。
        (p317图11.7串行调度、可串行化的调度、不可串行化的调度) 

         2、冲突可串行化调度

        具有什么样性质的调度是可串行化的调度?如何判断某个调度是可串行化的调度?下面给出判断可串行化调度的充分条件
        设有两个事务Ti和Tj,其调度为S,S中有两个相邻的语句li和lj(指read(读)或write(写)语句),分别来自Ti和Ti。如果li和lj不同的数据操作,那么交换li和Ii的次序丝毫不影响调度执行的结果。当li和Ij对同一数据Q操作时,就不一定了。下面就li和Ij对同一数据进行操作,讨论其次序是否可交换

        (1)li=read(Q),j=read(Q)。

        此时事务Ti和Tj读到同样的Q值可忽视li和lj的先后次序

        (2)li=read(Q),Ij=write(O)。

        在调度S中,如果li在lj之前,那么Ti没有读到Tj中写回的Q值,如果lj在li之前,那么Ti读了Tj中写回的Q值。这样,li和lj的次序是很重要的。
        (3)li=write(Q),Ij=read(Q)。

        情况与(2)类似。
        (4)li=write(Q),Ij=write(Q)。

        由于li和lj都是写操作,因此对事务Ti和Tj都没有影响。但数据库中保存的是Ti和Tj后一个写操作的结果,因而li和lj的次序对调度S中中随后的read语句有影响。如果调度中没有其它写语句,那么li和lj的次序直接影响到事务结束后数据库中的值。 

        上面只有第(1)种情况中,与li和lj的先后次序无关,其它都有关系。

        定义:li和lj分别是并发事务Ti和Tj中的read或write语句,并在并发调度中相邻。当li和j是对同一数据操作时,并且致少有一个是write语句,我们称li和ij是一对“冲突”的语句,否则称为“非冲突”的语句。

        在调度S中,有一对相邻的语句是“非冲突”的语句,那么它们的先后次序可以交换。交换后产生的新调度S和S等价。  

        例:

T1      T2  
①read(A)
②write(A)
read(A)
write(A)
⑤read(B)
⑥write(B)
read(B)
write(B)

        调度如下:

        Sc=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)

        w1(A)r2(A)此处:w1(A):事务T1 对A 写操作 r2(A) 事务T2 对A读操作  两者为相邻操作且同对A 操作,所以此时为冲突语句,顺序不可以交换!

        w2(A)r1(B)w1(B) :此时是对不同数据进行读写,不是冲突语句,所以此时可以交换顺序

        Sc=r1(A)w1(A)r2(A)r1(B)w1(B)w2(A)r2(B)w2(B)

        S`c=r1(A)w1(A)r1(B)w1(B)r2(A)w2(A) r2(B)w2(B)

        将Sc中不冲突的调度的顺序进行调整,变成了S`c先执行事务T1 再执行事务T2,为串行调度
        在这个并发调度中,事务T1中的w1(A)和T2中的r2(A)是一对冲突的语句,次序不能交换。

        交换非冲突语句:

        [1]T2中的w2(A)和T1中的r1(B)w1(B)交换;

        [2]T2中的r2(A)和T1中的r1(B)w1(B)交换;

        等价于先执行T1后执行T2的串行调度

        定义:

        如果调度S`是从调度S通过交换一系列的非冲突语句得到,那么称S和S是一对“冲突等价”调度。如果调度S与某个串行调度是“冲突等价”,那么称调度S是“冲突可串行化”的调度。 

         冲突可串行化的调度:可以推出这个调度是可串行化的调度

        可串行化的调度:不能推出这个调度是冲突可串行化的调度

        两段锁协议

        为了保证并发调度的正确性,DBMS的并发控制机制必须提供一定的手段来保证调度是可串行化的。目前DBMS普遍采用两段锁(Two-Phase Locking,简称2PL)协议的方法实现并发调度的可串行性,从而保证调度的正确性。

        两段锁协议是封锁协议的一种。

        【封锁协议(LockingProtocol):

        在运用封锁方法时,对数据对象加锁时需要约定一些规则,例如何时申请封锁、持锁时间、何时释放封锁等。我们称这些规则为封锁协议

        约定不同的规则,就形成了各种不同的封锁协议。两段封锁协议是最常用的一种封锁协议,理论上已经证明使用两段封锁协议产生的是可串行化调度。】 

        两段锁协议(考):

        是指所有事务必须分两个阶段对数据项加锁和解锁:

        1)在对任何数据进行速、写操作之前,事务首先要申请并获得对该数据的封锁,

        2)在释放一个封锁之后,事务不再获得任何其他封锁。

        “两段”锁的含义事务分为两个阶段:

        第一阶段是获得封锁,也称为扩展阶段:

        在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁, 

         第二阶段是释放封锁,也称为收缩阶段。

        在这阶段,事务可以释放任何数据项上的任何类型的锁,但不能再申请任何锁

        例如:

        事务Ti遵守两段锁协议,其封锁序列是:
        Slock A…Slock B… Xlock C…(第一段锁协议:加锁)Unlock B….Unlock A….UnlockC:(释放封锁阶段:只能释放封锁)
        事务Tj不遵守两段锁协议,其封锁序列是:
        Slock A(获得锁) .…. Unlock A(释放锁)…. Slock B(获得锁)… Xlock C… Unlock C(释放锁)….Unlock B:

        可以证明,并发执行的所有事务遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。(p301验证例子)。所有遵守两段锁协议的事务,其并发执行的结果一定是正确的

        事务遵守两段锁协议是可串行化调度的充分条件(遵循两端锁协议=>可串行化调度),而不是必要条件(可串行调度!=>遵循两段锁协议)。 

封锁粒度 (自己看书了解):需要掌握多粒度封锁、意向锁

  • 11
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值