内容主线:
并发调度的可串行性
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验证例子)。所有遵守两段锁协议的事务,其并发执行的结果一定是正确的。文章来源:https://www.toymoban.com/news/detail-565333.html
事务遵守两段锁协议是可串行化调度的充分条件(遵循两端锁协议=>可串行化调度),而不是必要条件(可串行调度!=>遵循两段锁协议)。 文章来源地址https://www.toymoban.com/news/detail-565333.html
封锁粒度 (自己看书了解):需要掌握多粒度封锁、意向锁
到了这里,关于并发调度的可串行性:可串行化调度、冲突可串行化调度、两段锁协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!