首先了解冲突操作的概念:冲突操作是指不同的事务对同一个数据的读写操作和写写操作
:
$R_i(x)$与$W_j(x)$ -----事务$T_i$读x,$T_j$写x,其中$i \neq j$
$W_i(x)$与$W_j(x)$ -----事务$T_i$写x,$T_j$写x,其中$i \neq j$
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度$Sc_1$,如果$Sc_1$是可串行的,称调度Sc为冲突可串行化的调度。 若一个调度是冲突可串行化,则一定是可串行化的调度
例题:
今有调度$Sc=r_1(A)w_1(A)r_2(A)w_2(A)r_1(B)w_1(B)r_2(B)w_2(B)$, 判断该调度是否是冲突可串行化的。
这题的解法:
1.首先知道交换规则:
- 同一个事务的任何两个操作不能交换
- 不同事务对同一元素的两个写操作不能交换
- 不同事务对同一元素的一读一写操作不能交换
2.当通过交换得到任何一个事务都是串行的,即是冲突可串行化的,否则不是。
解析:
1.首先可以把$w_2(A)$与$r_1(B)w_1(B)$交换,得到
$r_1(A)w_1(A)r_2(A)r_1(B)w_1(B)w_2(A)r_2(B)w_2(B)$
2.再把$r_2(A)$与$r_1(B)w_1(B)$交换
得到$Sc_2=r_1(A)w_1(A)r_1(B)w_1(B)r_2(A)w_2(A)r_2(B)w_2(B)$
$Sc_2$等价于一个串行调度$T_1$、$T_2$。所以$Sc_1$为冲突可串行化调度。