案例题目
问题1 系统发生故障时,满足持久化要求的事务有哪些?不满足持久化要求的事务有哪些?
老规矩,先画草稿 由题可知I=3,J=6,K=11 所谓持久化就是已经写入数据库的并COMMIT的,不管在故障前的COMMIT还是故障后的COMMIT,故障前就不用说了,已经写入数据库并日志记录了,故障后的COMMIT还能根据日志文件Redo回来,所有这些事务都会满足持久化的要求
答案:T1,T2满足持久化要求,T3,T4不满事务持久化要求
看草图分析
T1 I=5,J=7
T2 I=4
T1 COMMIT (此时I=5,J=7 已经是板上钉钉的值了)
Checkpoint(发生故障)
T2 J=8
T3 K=18
T4 K=19
T2 COMMIT (虽然写入了日志,但是因为在故障前提交,所以此时的值还是I=5,J=7)
根据前面学习的,在恢复的时候我们知道,只要已经提交的事务,后面的值都会恢复,所以T2中I=4,J=8是必然的。
这样就清晰明了了,T1、T2的值都会改变符合事务数据持久化的要求, 而T3和T4没有COMMIT,他们的数都不会改变,不符合数据持久化的要求。 ————————————————————————————————————
问题2: 系统恢复后,数据项I、J、K的数值哪些会恢复为初始值?哪些不会恢复为初始值?请给出 系统恢复后I、J、K的值。
只要前面认真画了草稿,第二题的答案一眼就能看出来了。 我们知道最后I、J的值是T2改的,那么它就是最终值,I=4,J=8; K是T3和K4改的,但是都没有COMMIT,所有K还是原来的值11.
答案:I,J不会恢复初始值,K会恢复初始值,系统恢复后I=4,J=8,K=11。
————————————————————————————————————
问题3:如果系统采用先写数据库再记日记的机制,故障发生前已经提交了事务T2,但没有记录到 <T2,COMMIT>。请给出系统恢复后I、J、K的值。
我们知道,只要在故障发生前后没有COMMIT的都做Undo(撤销)操作,就是数据不会保存下来,题目说没有记录到T2 COMMIT 所有T2的事务并没有成功,那么就按照T1事务修改的值来,k的值更不用说了,一样。
答案:I=5,J=7,K=11
————————————————————————————————————
问题4:基于问题2和问题3的结果,请用50字以内的文字简要说明为什么先写日志机制更优。
这是个考验你是否懂得先写日志优点的问题,答案作为参考,可以用自己话描述大概即可
答案:如果先写入数据文件,后写日志,可能导致数据被修改后,该条修改记录没有来得及写入日志,系统就发生了故障,在恢复时无法恢复该条记录。而先写日志,后写数据文件,即使在写日志与写数据文件的间隙发生了故障,并不影响最终数据库恢复的正确执行。