调度(schedule)指数据库要执行多项事务,每项事务包括好几条指令,先执行什么指令后执行什么指令的安排。
但是指令的安排顺序(即调度)不同,事务的执行结果也不同。例如
|
事务1 |
|
事务2 |
1.1 |
t = read(a) |
1.2 |
s = read(a) |
2.1 |
t = t + 100 |
2.2 |
s = s × 2 |
3.1 |
write(a,t) |
3.2 |
write(a,s) |
4.1 |
t = read(b) |
4.2 |
read(b,s) |
5.1 |
t = t + 100 |
5.2 |
s = s × 2 |
6.1 |
write(b,t) |
6.2 |
write(b,S) |
设a初始值为10,b初始值为20。
如果调度为1.1, 1.2, 2.1, 2.2, 3.1, 3.2, 4.1, 4.2, 5.1, 5.2, 6.1, 6.2,a=20,b=40。
如果调度为1.1, 2.1, 3.1, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 4.1, 5.1, 6.1,a=220,b=140。
所以调度不同,事务执行结果也不同。我们必须有一个标准来判断某种调度是否正确。这个标准就是事务串行——先执行事务1的所有指令,再执行事务2的所有指令——后的结果。如果调度结果与串行结果相同,则调度正确;反之则错误。此概念与操作系统中多线程的执行类似。
对于正确的调度,我们给它一个形容词,说此调度是可串行的(Serializable)。可串行的是英文直译,更准确的词可以是“串行等价的”,即该调度的结果与事务串行的结果是相等的。下文就使用串行等价这个词。
如果两项事务只是读数据,则指令的执行顺序是无关紧要的;
如果两项事务读写不同的数据,则指令的执行顺序是无关紧要的;
如果两项事务读写同一条数据,则指令的执行顺序是重要的。我们把这两项事务称为冲突的事务。
第(1)(2)两类事务的任何调度,都是串行等价的。对于第(3)类事务,如果调度正确,我们可以说此调度是冲突可串行的(Conflict Serializable),更准确的说法可以是“冲突串行等价的”,表示该调度的结果与冲突(的事务)串行的结果是相等的。冲突串行等价的是串行等价的的子类。
爱让一切都对了
2011年4月10日 星期日
本文依照知识共享-署名-相同方式共享3.0协议发表。