数据库通常由元素构成
每个事务都会读/写某些元素
每个事务都以提交或者撤销结束
DBMS需要保证事务的:
缓冲区处理策略
Begin TRANSACTION READ(A,t); t:=t*2; WRITE(A,t); READ(B,t); t:=t*2; WRITE(B,t) COMMIT; End TRANSACTION
一个包含日志记录的只能追加的顺序文件, 不同事务的日志记录交错存储,按发生时间存储
日志记录的信息
<Start T>,表示事务T已经开始 <Commit T>,表示事务T成功完成 <Abort T>,事务T未成功,被中止 <T, X, v1> 或者 <T, X, v2> 或者 <T, X, v1,v2> 表示事务T改变了数据库元素X,X原来的值为v1(X的旧值),X新的值为v2.
缓冲区处理策略与日志/恢复策略的关系
Undo型日志
首先, <T, X, v>被写到日志中(把更新前的值写入磁盘) 其次,OUTPUT(X) (把缓冲区的内容写入磁盘) 最后, <COMMIT T>或<ABORT T>被写到日志中
<STARTT>….<COMMITT>….=yes <STARTT>….<ABORTT>…….=no(已结束,但未完成) <STARTT>……………………… =no
<COMMITT>:标记T已完成 <ABORTT>:标记T已结束但未完成 <T,X,v>: 如果T未完成,则将X=v写回磁盘;否则跳过; <STARTT>:跳过
因事务未提交。通过日志恢复A=8, B=8,保证了事务的原子性
因事务已提交。无需做任何事情,已保证了事务的原子性
检查点
为什么需要检查点?
(1)因为并不知道处理到日志的哪一个位置才能结束
(2)若在恢复过程中,发生故障怎么办?
静止检查点:周期性地对日志设置检查点
(1)停止接受新的事务, 等到所有当前活跃事务提交或终止,并在日志中
写入了COMMIT或ABORT记录后
(2)将日志刷新到磁盘,写入日志记录,并再次刷新日志
非静止检查点(动态检查点)
(1)在设置检查点时不必关闭系统, 允许新事务进入
(2)写入一条**<START CKPT(T1,…,Tk)>**
其中T1,…,Tk 是所有活跃的未结束的事务
(3)继续正常的操作,直到T1,…,Tk都完成时,写入<END CKPT>
eg:静态检查点
eg:非静态检查点
Redo型日志
首先,<T, X, v>被写到日志中(更新后的值) 其次,<COMMIT T>被写到日志中 最后,OUTPUT(X)
利用redo日志进行恢复
<STARTT>….<COMMITT>….=yes <STARTT>….<ABORTT>…….=no(已结束,但未完成) <STARTT>……………………… =no
<COMMITT>:标记T已完成 <ABORTT>:标记T已结束但未完成 <T,X,v>: 如果T已完成,则将X=v写回磁盘;否则跳过; <STARTT>:跳过
检查点
非静止检查点
(1)在进行检查点设置时不必关闭系统,允许新事务进入
(2)写入一条<START CKPT(T1,…,Tk)>
其中T1,…,Tk 是所有活跃的未结束的事务
(3)将所有已提交的事务写回磁盘,
(4)继续正常的操作,直到T1,…,Tk都完成时,写入<END CKPT>