|
|
知识路径: > 数据库技术 > 事务管理 > 数据库的并发控制 > 事务调度 >
|
|
被考次数:4次
|
|
被考频率:
中频率
|
|
总体答错率:
48%
|
|
知识难度系数:
|
|
考试要求:
掌握
|
|
相关知识点:20个
|
|
|
|
|
串行调度(serial schedule)是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完后才执行另一个事务的所有操作。
|
|
|
我们考虑一个简单的银行数据库系统。设每个账号在数据库中具有一条数据库记录,用以记录这个账号的存款数量和其他信息。设有两个事务T0和T1,事务T0从账号A转2000元到账号B;事务T1从账号A转20%的款到账号B。T0和T1的定义如下图所示。
|
|
|
|
|
假设用A和B表示账号A和账号B的存款数量;A、B的初值为10 000和20 000。如果这两个事务串行执行,可以有两种调度方案。调度S1是先执行T0后执行T1,如下图(a)所示。运行结束时,A和B的最终值分别是6400和23 600。调度S2是先执行T1后执行T0,如下图(b)所示。运行结束时,A和B的最终值分别是6000和24 000。无论采用两种方案的任一种,A+B在两个事务执行结束时仍然是10 000+20 000。
|
|
|
|
|
从上面的例子可以看出,不论是先执行T0后执行T1,还是先执行T1后执行T0,只要是串行调度,执行的结果都是稳定的和正确的。对于N个事务,最多有N!种正确的串行调度。
|
|
|
|
并发调度(concurrent schedule):利用分时的方法同时处理多个事务。
|
|
|
对于N个事务进行并发调度,情况会变得复杂得多,它的调度方案远大于N!个,而且并发调度的结果有可能是错误的。下图(a)调度S3是一个并发调度,其执行的结果与串行调度执行的结果相同,则称这个并发调度是正确的。下图(b)调度S4也是一个并发调度,但其导致A、B的最终结果为8000和24 000,A+B=8000+24 000≠30 000,这个结果是错误的。我们称此并行调度将产生不一致状态。
|
|
|
|
|
|
若事务Ti提交失败,则应当撤销Ti的影响以保证其原子性。在允许并发执行的系统中,还必须确保依赖于Ti的任何事务Tj也中止。例如,Tj要读Tj写的数据,则称Tj依赖于Ti。
|
|
|
例如,下图所示的调度示例。假设系统允许T1执行完read(A)后立即提交,则T1就先于T0提交。假设T0在提交前发生故障,由于T1依赖T0(T1要读T0写的数据),为了保证事务的原子性必须中止T1的提交。但本例允许T1执行完read(A)后立即提交,导致T0发生故障后不能正确恢复的情景。
|
|
|
|
|
可恢复调度(recoverable schedule)应满足:当事务Tj要读事务Ti写的数据时,事务Ti必须要先于事务Tj提交。
|
|
|