4.考虑下图所示的日志记录:
序号 | 日志 |
---|---|
1 | T1:开始 |
2 | T1:写A,A=10 |
3 | T2:开始 |
4 | T2:写B,B=9 |
5 | T1:写C,C=11 |
6 | T1:提交 |
7 | T2:写C,C=13 |
8 | T3:开始 |
9 | T3:写A,A=8 |
10 | T2:回滚 |
11 | T3:写B,B=7 |
12 | T4:开始 |
13 | T3:提交 |
14 | T4:写C,C=12 |
(1)如果系统故障发生在14之后,说明哪些事务需要重做,哪些事务需要回滚。
由于T1和T3已经提交,需要重做,T2已经回滚,T4开始但是没结束。
重做:T1、T3
回滚:T4
(2)如果系统故障发生在10之后,说明哪些事务需要重做,哪些事务需要回滚。
由于T1已提交,T2已回滚,T3已经开始但是没有结束,T4还没有开始
重做:T1
回滚:T3
(3)如果系统故障发生在9之后,说明哪些事务需要重做,哪些事务需要回滚。
由于T1已经提交,T2和T3还未结束,此时T4还没有开始
重做:T1
回滚:T2、T3
(4)如果系统故障发生在7之后,说明哪些事务需要重做,哪些事务需要回滚。
由于T1已经提交,T2未结束,T3、T4未开始
重做:T1
回滚:T2
注:系统重新启动后,恢复子系统,需要重做已经提交的事务,撤销没完成的事务
5.考虑题4所示的日志记录
假设开始时A,B,C的值都是0:
(1)如果系统故障发生在14之后,写出系统恢复后A、B、C的值;
重做:T1、T3
回滚:T4
A=8,B=7,C=11
(2)如果系统故障发生在12之后,写出系统恢复后A、B、C的值;
重做:T1
回滚:T3、T4
A=10,B=0,C=11
(3)如果系统故障发生在10之后,写出系统恢复后A、B、C的值;
重做:T1
回滚:T3
A=10,B=0,C=11
(4)如果系统故障发生在9之后,写出系统恢复后A、B、C的值;
重做:T1
回滚:T2、T3
A=10,B=0,C=11
(5)如果系统故障发生在7之后,写出系统恢复后A、B、C的值;
重做:T1
回滚:T2
A=10,B=0,C=11
(6)如果系统故障发生在5之后,写出系统恢复后A、B、C的值。
重做:无
回滚:T1、T2
A=0,B=0,C=0
注:恢复:在故障发生前,已提交的事务记入重做,未完成的事务记入撤销队列
总结:
1.回滚=撤销
2.系统重新启动,恢复子系统,关于事务:
重做:已经提交的事务,撤销:未完成的事务
3.恢复:故障发生前
重做:已提交事务,撤销:未完成事务
完。