数据库管理系统对并发事务不同的调度可能会产生不同的结果,那么什么样的调度是正确的呢?显然,串行调度是正确的。执行结果等价于串行调度的调度也是正确的。这样的调度称为可串行化调度。
1.可串行化调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。可串行性(Serializability)是指并发事务正确调度的准则。一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
[例11.2]现在有两个事务,分别包含下列操作:
事务T1:读B;A=B+1;写回A
事务T2:读A;B=A+1;写回B
现给出对这两个事务不同的调度策略。




2.冲突可串行化调度
一个比可串行化更严格的条件,为商用系统中的调度器采用。
(1)冲突操作是指不同的事务对同一数据的读写操作和写写操作:
Ri(x)与Wj(x) /*事务Ti读x,Tj写x,其中i≠j*/
Wi(x)与Wj(x) /*事务Ti写x,Tj写x,其中i≠j*/
其他操作是不冲突操作。
(2)不能交换(Swap)的动作:同一事务的两个操作;不同事务的冲突操作。
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc是冲突可串行化的调度;若一个调度是冲突可串行化,则一定是可串行化的调度。可用这种方法判断一个调度是否是冲突可串行化的。

冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度。
[例11.4]有3个事务
T1=W1(Y)W1(X),T2=W2(Y)W2(X),T3=W3(X)
调度L1=W1(Y)W1(X)W2(Y)W2(X) W3(X)是一个串行调度。
调度L2=W1(Y)W2(Y)W2(X)W1(X)W3(X)不满足冲突可串行化。但是调度L2是可串行化的,因为L2执行的结果与调度L1相同,Y的值都等于T2的值,X的值都等于T3的值
一、并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
二、什么样的并发调度是正确的调度?