多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,称这种调度为可串行化的调度。目前的数据库管理系统普遍采用封锁方法来实现并发操作的可串行性,从而保证调度的正确性。两段锁协议是保证并发调度的可串行性的封锁协议。图7—12并发事务的不同调度......
2023-11-24
并发控制(concurrency control)是为了保证事务的隔离性(I)和一致性(C)。
分布式数据库管理系统的并发控制是为了保证多用户分布环境下的数据库一致性。如果事务内部一致(即不损害任何一致性约束),最简单的方法是让每一个事务单独执行,一个接着一个,互不干扰。当然,这只是理论上合理,实施起来无意义,因为这么做会把系统的吞吐量弄得很小,这不是我们所期待的。并发程度(并发事务的个数)是分布式数据库系统性能好坏的重要参数之一。因此,数据库系统的并发控制机制力图找出一个折中,使得既能保持数据库的一致性,又能维持高度的并发性。
现在我们假设整个分布式系统是完全可靠的,既没有任何软件故障,又没有硬件故障。尽管这是不现实的,但是可以简化我们的讨论。关于可靠性问题我们将在下一章讨论。
可串行化(serializability)是大家广泛认同的能保证并发控制算法正确性的依据。可串行化是涉及并发控制的一个重要理论。为了说明这个理论,我们需要先给出一些定义。
调度(schedule)是指一个调度S(也称历史(history))定义在一个事务集合T上,T={T1,T2,…,Tn},它可以指定这些事务的执行序。
对于任意一对操作aij(x)和akl(x)(i和k是事务标识,不必一样,即这两个操作可以属于不同的事务),它们存取同一个数据库的数据项x,如果它们中间有一个是写(write)操作,则它们是冲突(conflict)的。这样可以将这两个操作简单标为“读”和“写”,从而归结成两类冲突:读-写(read-write)(或写-读(write-read))冲突和写-写(write-write)冲突。其实,这两个操作可能来自同一个事务,也可能来自不同的事务。如果来自不同的事务,则这两个事务是冲突的。
下面先来定义一个完整调度(complete schedule),该调度定义了该域里所有操作之间的执行序。
定义9.1 一个完整调度的前缀是指由该域的事务子集构成的偏序,令POT为事务子集上的完整调度,则T={T 1,T 2,…,Tn}构成一个偏序POT={ΣT,≯T},其中:
条件3:对于任意两个冲突操作而言,aij,akl∈ΣT,aij≯T akl,或者akl≯T aij。
条件1表示调度涉及的域是一个由各个事务构成的集合。条件2定义了一个序,它是各个事务序集合的超集。条件3强调任意一对冲突操作间必须有一个序。
【例9.1】 考虑两个事务T 1和T 2的序:
T1: Read(x)
这样,关于这两个事务的一个完整调度POT为T={T 1,T 2},POT={ST,≯T},存在:
Σ1={r1(x),w1(x),C1}
Σ2={r2(x),w2(x),C2}
这样,ΣT=Σ1∪Σ2={r1(x),w1(x),C1,r2(x),w2(x),C2},且POT={〈r1,r2〉,〈r1,w1〉,〈r1,C1〉,〈r1,w2〉,〈r1,C2〉,〈r2,w1〉,〈r2,C1〉,〈r2,w2〉,〈r2,C2〉,〈w1,C1〉,〈w1,w2〉,〈w1,C2〉,〈C1,w2〉,〈C1,C2〉,〈w2,C2〉}
这个调度可以用一个有向无环图(即DAG图)来表示,如图9.1所示。
我们可以使用简化一点的方式来描述这样一个调度,因为可以忽略那些无需强调的序,如〈r1,r2〉,〈r1,C1〉[1]等。可以让执行序与表中操作的顺序对应,这样POT可简化为:
POT=[r1(x),r2(x),w1(x),C1,w2(x),C2]
可以将一个调度P看成是一个完整调度P的前缀。
给定一个偏序P={Σ,≯},令P={Σ,≯}为P的一个前缀,如果满足:
图9.1 一个完整调度的DAG表示
(1)Σ⊆Σ;
(2)∀ai∈Σ,a1≯a2 iff a1≯a2;
(3)ai∈Σ,if∃aj∈Σ∧aj≯ai,then aj∈Σ。
前两个条件把P的域S定义在P的域S上,P中的序仍然保持在P中。第三个条件表示S中的所有元素,如果在S中有前元(predecessor),则它们在S中也有前元。
【例9.2】 我们来看如下三个事务:
从以上事务可以看出,如下调度S是串行的(serial):(www.chuimin.cn)
S=[w2(x),w2(y),r2(z),C2,r1(x),w1(x),C1,r3(x),r3(y),r3(z),C3]
因为T 2的所有操作都在T 1的所有操作前执行,T 1的所有操作都在T3的所有操作前执行,所以可以记作T 2≯s T 1≯s T 3或T 2→T 1→T 3。
例9.2所示的是一个串行调度。
串行调度能保证事务的一致性,但是系统的效率低。有更有效的办法吗?下面我们讨论可串行化的问题。
定义9.2 在一个调度S中,若各个事务的操作执行时不叠加(即操作一个接着一个发生),则这个调度是串行的。
两个调度S1和S2定义在相同的事务集上,如果它们对数据库产生相同的效果,则称为是等价的。更形式化地说,如果S1和S2定义在相同的事务集上,对它们中任意一对冲突操作aij和akl(i≠k)来说,如果aij≯S1 akl,则aij≯S2 akl,反之亦然,我们称之为冲突等价(conflict equivalence)。两个满足冲突等价的调度是等价的。
两个调度的等价条件可以定义如下。
条件1:在两个调度中,每个读操作读到的是相同写操作产生的数据。
条件2:且两个调度中对每个修改数据项的最后一个写操作相同。
【例9.3】 再考虑例9.2中的三个事务,S是一个定义在三个事务上面的调度,它的冲突等价于串行S:
S=[w2(x),r1(x),w1(x),C1,r3(x),w2(y),r3(y),r2(z),C2,r3(z),C3]
这里:对x来说,按照冲突操作对的序,则T2→T1→T3;对y来说,按照冲突操作对的序,则T 2→T 3;对z来说,r2(z)和r3(z)不冲突,不需要强加序。因此,S等价于T2→T 1→T 3。
注意,冲突等价满足第三级一致性。
定义9.3 一个调度Sc是可串行的(serializable),当且仅当Sc冲突等价于一个串行调度,这种可串行化通常称为冲突等价可串行化(serializability)。
并发控制器的基本功能是产生一个要执行事务的可串行化调度。
可串行化理论可以简单地用于无副本的分布式数据库中。我们把每个节点上事务执行的调度称为本地调度,整个分布式数据库上的调度称为全局调度。此时,如果一个全局调度的每个本地调度是可串行的,且每个本地串行调度序是相同的,则这个全局调度是可串行的。在有副本的分布式数据库系统中,可串行化理论的要求更复杂些。
【例9.4】 我们来看以下两个事务:
它们同时在两个副本所在地,也就是在两个节点上运行。下面是两个节点上的本地调度:
S1=[r1(x),w1(x),C1,r2(x),w2(x),C2]
S2=[r2(x),w2(x),C2,r1(x),w1(x),C1]
这两个调度都是可串行化的,确切来说是串行的。因此每一个调度代表一个正确的执行序。但要指出的是,在这两个调度中,T 1和T2的序是互相颠倒的,即S1等价于T1→T 2,S2等价于T 2→T 1。
如果在执行这两个事务前x的值是10,结果在执行这两个事务后,x在S1为150,在S2为105。
例9.3在现实中是不允许的,我们要求S1和S2应当满足互一致性。互一致性要求所有的副本数据值都是一样的。
直观地说,一个单副本可串行化全局调度必须满足如下条件。
●每个本地调度都是可串行化的。
●两个冲突操作在它们同时出现的所有本地调度中都必须有相同的序。
第二个条件保证在冲突事务一起执行时,所有节点上的串行序是相同的。
显然,在有副本的数据库中,需要附加副本控制协议。
假设一个数据项x有副本x1,x2,…,xn。下面我们把x称为逻辑数据项,其副本称为物理数据项。如果提供副本透明度,用户事务就对逻辑数据项x发布读/写操作要求。副本控制协议负责把逻辑数据项x上的每个读操作(Read(x))映射到一个物理数据项副本的读操作(Read(xj))上。将逻辑数据项x上的每个写操作映射到所有x的物理数据副本子集的写操作集上。是映射到物理数据项副本的全集还是子集取决于副本控制算法。如果把读操作映射到其中一个副本上,那么写操作就映射到一个物理数据项副本的全集上,这个算法就满足readonce/write-all(ROWA)协议。
有关分布式数据库技术的文章
多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,称这种调度为可串行化的调度。目前的数据库管理系统普遍采用封锁方法来实现并发操作的可串行性,从而保证调度的正确性。两段锁协议是保证并发调度的可串行性的封锁协议。图7—12并发事务的不同调度......
2023-11-24
有多种并发控制算法的分类方式。按照同步原语可以将并发控制算法分成两类:基于互斥存取共享数据的算法和将事务排序按规则执行的算法。图9.10并发控制算法的分类●在主本封锁中,将每个封锁单元的某个副本指定为主本,在访问该单元时主本必须封锁。这些算法可以分成基本TO、多版本TO和保守TO等。实际上,在某些基于封锁的算法中也使用时标,因为这样可以改进效率和并发性,我们称为混合算法。......
2023-10-28
下面先讨论学术界对可串行化理论的修正,即可线性化理论。维基百科[2]对可线性化的定义为:可线性化首先由Herlihy和Wing于1987年在介绍一致性模型时引入。因此,我们可以非形式化地给出可线性化的定义,如下。这个过程是非线性化的。为了实现线性化,要求对每个进程Pi使用自己的寄存器Ri。......
2023-10-28
前面讨论了面向对象数据库系统的事务管理,本节讨论并发控制的核心问题,即可串行化问题。由面向对象数据库系统的事务可知,这是学术界所说的开放嵌套事务。为此,我们提出了面向对象可串行化的思想。对象调度的面向对象可串行化给出了一个动作序列。我们把一个事务的系统调度称为是面向对象可串行化的,如果所有的对象调度都是面向对象可串行化的,那么所有的附加动作依赖关系不含冲突。如图15.10所示,将三个事务发送给对象En......
2023-10-28
不像基于封锁的算法,基于时标的并发控制算法不通过互相排斥来维持可串行化。这里,唯一性是时标的第一个性质。协调事务管理器为每个事务指定时标,确定每个数据项存放的节点,并向这些节点发送执行相关操作的命令。下面的算法称为基本时标序事务管理算法,记作BTO-TM。严格2PL算法要求封锁必须推迟到事务的提交或夭折才释放,同样也可以给出一个严格的TO算法。......
2023-10-28
基于封锁的并发控制的主要思想是,保证冲突操作共享的数据一次只能由一个操作存取。表9.1封锁模式的兼容矩阵在基于封锁的系统中,这是由封锁管理器来实现的。封锁管理器检查该封锁单元是否已上锁。事务结束时,解除全部封锁。图9.2表示一旦完成对一个数据项的存取,封锁管理器就释放对数据项的封锁。图9.22PL的形态图9.3严格的两阶段封锁图严格的两阶段封锁管理需要对算法9.1略作修改。算法9.2 严格的两阶段封锁LM算法。......
2023-10-28
前面讨论的并发控制算法都是悲观算法。反之,夭折该事务,并重新启动它。图9.7乐观事务的执行阶段可以设计一个基于封锁的乐观并发控制算法。不过原始乐观建议是基于时标序的。论文提出,事务冲突并不很频繁时,乐观算法的性能优于封锁算法的性能。乐观算法的一个主要缺点是存储开销较大。为了能够验证,乐观机制必须存储其他已终止事务的读集和写集。然而,减少了并发度,因为这仅让一个事务运行。......
2023-10-28
在多版本并发控制方法中经常采用异地更新技术,即不是直接在旧数据项上修改,而是先创建一个数据项的新版本,然后让新版本取代旧版本。使用MVCC的好处是,读请求不会因为存在写操作而被阻塞。数据库中的只读访问常常检索的是已被提交的数据项版本。系统的开销主要发生在相同数据项的多个版本上。有一种称为快照隔离的技术用于实现支持MVCC的数据库。SI的开销虽然小,但弱化了可串行化。SI包含以下两个重要性质。......
2023-10-28
相关推荐