可串行化(Serializability)
Serializability of a schedule means equivalence (in the outcome, the database state, da
可串行化是一个调度,即多个事务之间的执行方式;而多个事务之间的执行有个先后顺序,如果事务之间没有共同的操作对象(读或写操作),则事务之间的执行顺序前后置换是没有关系的;但是如果事物间存在共同的操作对象,则事务间先后执行的顺序则需要区分;对于存在共同操作对象的多个并发执行的事务,如果其执行结果“等价”于某个“串行化调度”,则这个调度才是“可串行化的调度”。满足“可串行化的调度”则具有了可串行化(Serializability)属性。所以,可串行化(Serializability)属性保证的是多个事务并发时的执行顺序要对数据的一致性没有影响。
如图1-8,三个并发的事务,之间满足串行化调度(serial schedule),即事务之间没有操作相同的数据(分别操作了不同的数据X、Y、Z),而可串行化调度的执行结果,调度结果等价于串行化调度,但需要引入几个概念来保证等价效果,这几个概念就是:冲突行为(Conflicting actions)、冲突等价(Conflict equivalence)、冲突可串行化(Conflict-serializabl)。
表1-8串行化调度示例
T1 | T2 | T1 |
R(X) |
|
|
| R(Y) |
|
|
| R(Z) |
W(X) |
|
|
| W(Y) |
|
|
| W(Z) |
Commit | Commit | Commit |
下面我们来讨论冲突行为、冲突等价、冲突可串行化。
q 冲突行为(Conflicting actions):又称为冲突动作,当有两个动作满足如下三个条件,则这两个动作是冲突的:
n 此两个动作属于不同的事务;
n 至少一个动作是写操作;
n 动作在操作同一个对象(读同一个对象或写同一个对象)。
q 冲突等价(Conflict equivalence):对于不同的事务调度方式S1和S2,如果满足如下两个条件,则事务调度方式S1和S2是等价的:
n S1和S2调度方式包括同样的事务集合(每一个事务中的操作的顺序是固定的,不能在不同的调度方式下发生变化);
n S1和S2调度方式包括同样的冲突操作集合。
q 冲突可串行化(Conflict serializabl):当某个调度是一个“冲突等价”于一个或多个“串行调度”,则这个调度是“冲突可串行化”的。这相当于把并发事务等价于了某“多个事务的串行执行”,用显而易见的串行的结果必然满足一致性(数据的一致性)来表示并发事务的调度带来的结果也满足一致性(所以事务可以因此而并发地被执行以提高执行效率)。如表1-9,并发的调度方式中包括事务T1和T2在同时执行,这个调度方式“冲突等价”于串行执行的“<T1,T2>”而不等价于“<T2,T1>”,尽管只有一个“冲突等价”的串行执行,这个调度也是“冲突可串行化”的。
表1-9冲突可串行化调度示例
T1 | T2 |
R(X) |
|
| R(X) |
W(Y) |
|
Commit |
|
| W(X) |
| Commit |
所以,可串行化概念的作用在于保证并发的事务调度方式即能满足数据一致性需求,又能提高并发事务的执行效率。