文章目录
一:可串行化调度二:冲突可串行化调度(1)冲突操作(2)可串行化调度的充分条件:冲突可串行化三:两段锁协议四:封锁的粒度(1)概念(2)选择封锁的原则(3)多粒度封锁A:多粒度树B:多粒度封锁协议(4)意向锁一:可串行化调度
可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化(serializable)调度。可串行性是并发事务正确调度的准则, 也即一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度
例如,下面有两个事务,分别包含下列操作
事务T1T_{1}T1:读B、A=B+1、写回A;
事务T2T_{2}T2:读A、B=A+1、写回B;
假设A、B初值均为2,两个事务最多只有两种串行执行策略
T1T_{1}T1->T2T_{2}T2:A=3,B=4T2T_{2}T2->T1T_{1}T1:A=4,B=3
因此事务T1T_{1}T1和T2T_{2}T2不管怎样交叉并行运行,只有两种正确的结果(如上)。其他结果均是错误的,相应调度也称之为不可串行化调度
二:冲突可串行化调度
(1)冲突操作
冲突操作:是指不同事务对同一个数据的读写操作和写写操作。除此之外,其他操作均为不冲突操作
Ri(x)R_{i}(x)Ri(x)与Wj(x)W_{j}(x)Wj(x):事务TiT_{i}Ti读x,事务TjT_{j}Tj写xWi(x)W_{i}(x)Wi(x)与Wj(x)W_{j}(x)Wj(x):事务TiT_{i}Ti写x,事务TjT_{j}Tj写x
另外注意各种交换
不同事务的冲突操作不可交换同一事务内部的两个操作不可交换不同事务,同一数据的读读操作可以交换不同事务,不同数据,无论读写均可交换
(2)可串行化调度的充分条件:冲突可串行化
冲突可串行化:一个调度SC在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度SC‘^{`}‘,如果SC‘^{`}‘是串行的,则称调度SC为冲突可串行化的调度。若一个调度是冲突可串行化的,那么它一定是可串行化的调度
注意:冲突可串行化调度是可串行化调度的充分条件,不是必要条件。也就是说有可能某个调度是可串行调度,但它却不是冲突可串行化调度
例如,现在有一个调度SC1=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)r_{1}(A)w_{1}(A)r_{2}(A)w_{2}(A)r_{1}(B)w_{1}(B)r_{2}(B)w_{2}(B)r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)
考察两个不同事务的交界处,看它是否满足交换的条件
交换后SC1变为了SC2=r1(A)w1(A)r1(B)w1(B)r2(A)w2(A)r2(B)w2(B)r_{1}(A)w_{1}(A)r_{1}(B)w_{1}(B)r_{2}(A)w_{2}(A)r_{2}(B)w_{2}(B)r1(A)w1(A)r1(B)w1(B)r2(A)w2(A)r2(B)w2(B),它等价于一个串行调度T1T_{1}T1->T2T_{2}T2,因此SC1是冲突可串行化调度,也一定是一个可串行化调度
三:两段锁协议
两段锁协议(2PL):两段锁协议是三级封锁协议的特例,目前DBMS普遍采用该种协议实现并发调度的可串行性。具体内容如下
在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁在释放一个封锁之后,事务不再申请和获得任何其他封锁
其中“两段”是指事务分为两个阶段
第一阶段:获得封锁,也称为扩展阶段第二阶段:释放封锁,也称为收缩阶段
另外还需要注意
事务遵守两段锁协议是可串行化调度的充分条件,而非必要条件若并发事物都遵循两段锁协议,则对其的任何并发点都策略都是可串行化的若对并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议
最后注意区分两段锁协议和一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁
四:封锁的粒度
(1)概念
封锁粒度(granularity):是指封锁对象的大小。封锁对象可以是逻辑单元,也可以是物理单元。封锁粒度与系统并发度和并发控制的开销密切相关,一般来说,封锁粒度越大,数据库所能封锁的数据单元就越少,并发度越小,开销越小
逻辑单元:元组、关系、整个数据库等物理单元:页(数据页或索引页)、物理记录等
(2)选择封锁的原则
需要处理多个关系的大量元组的用户事务时以数据库为封锁单位需要处理大量元组的用户事务时以关系为封锁单元只处理少量元组的用户事务时以元组为封锁单位(3)多粒度封锁
多粒度封锁:在一个系统中同时支持多种封锁粒度供不同的事务选择
A:多粒度树
多粒度树是以树形结构来表示多级封锁粒度的方法
根结点是整个数据库,表示最大的数据粒度叶结点表示最小的数据粒度
B:多粒度封锁协议
多粒度封锁协议:允许多粒度树中的每个结点被独立地加锁,对一个结点加锁意味着这个结点的所有后裔结点也会被加上相同类型的锁。因此,在多粒度封锁中一个数据对象可能存在如下两种封锁方式
显式封锁:直接加到数据库对象上的封锁隐式封锁:由于上级结点加锁而使该数据对象也被加锁
多粒度封锁方法中,显式封锁和隐式封锁的效果是一样的,因此系统检查封锁冲突时不仅要检查显式封锁还要检查隐式封锁
例如事务TTT要对关系R1R_{1}R1加XXX锁,系统必须搜索其上级结点数据库、关系R1R_{1}R1以及R1R_{1}R1的下级结点,即R1R_{1}R1中的每一个元组,上下搜索。如果其中某一个数据对象已经加了不相容锁,则TTT必须等待
(4)意向锁
一般地,对某个数据对象加锁,系统要检查该数据对象上有无显式封锁与之冲突:再检查其所有上级结点,看本事务的显式封锁是否与该数据对象上的隐式封锁(即由于上级结点已加的封锁造成的)冲突;还要检查其所有下级结点,看它们的显式封锁是否与本事务的隐式封锁(将加到下级结点的封锁)冲突可以看出,这样的检查方法效率很低,因此意向锁由此诞生意向锁:如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。有如下三种常用的意向锁
意向共享锁(IS锁):如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁意向排他锁(IX锁):如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁共享意向排他锁(SIX锁):如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX
锁相容矩阵
(数据库系统概论|王珊)第十一章并发控制-第五 六 七节:并发调度的可串行性 两段锁协议和封锁的粒度
如果觉得《(数据库系统概论|王珊)第十一章并发控制-第五 六 七节:并发调度的可串行性 两段》对你有帮助,请点赞、收藏,并留下你的观点哦!