<T_i Start>
write(X)
操作时,写入日志记录 <T_i, X, V1, V2>
,其中 X
表示写入的对象, V1
表示写入对象的旧值, V2
表示写入对象的新值<T_i Commit>
示例:
<T1 start> <T1, A, 100, 200> <T2 start> <T2, B, 300, 400> <T3 start> <T1, C, 500, 600> <T1 commit> <T3, C, 600, 700> <T3, C, 700, 800> <T3 commit> <T2, C, 800, 900> <T2, B, 400, 500>
假设事务是序列执行的
事务执行 write(X)
操作时,实时写入日志记录,但不立即更新数据库存储的实际值,而是将更新进行延迟(Defer),直到发生故障
当发生故障时,对于已结束并提交的事务,将该事务的更新应用到数据库( redo(T_i)
);对于发生故障的事务,不进行任何操作,因为这些事务并未应用到数据库
示例:
延迟修改技术仅在事务结束并提交后才能对数据库进行更新,而立即修改技术允许未结束的事务对数据库进行更新
示例:
- Output 表示向 Disk 输出的更新的块
- 块的输出既可以在涉及的事务提交前进行,也可以在事务提交后进行
- 块的输出和它们的更新顺序可能不同
发生故障的恢复操作
定义两种运算:
undo(T_i)
:将事务 $T_i$ 进行的所有更新进行回退(从 $T_i$ 的最后一条日志记录开始,倒序进行回退)redo(T_i)
:将事务 $T_i$ 进行的所有更新进行应用(从 $T_i$ 的第一条日志记录开始,顺序进行更新)示例:
检查点 Checkpoint
<checkpoint L>
,其中 L
为检查点时正在执行的事务列表<checkpoint L>
记录。L
后的日志对应的事务进行 Redo 或 Undo 操作示例: