当前位置:文档之家› 数据库系统实现课后习题答案

数据库系统实现课后习题答案

6.1.2如果OUTPUT动作顺序恰当,即使在事务执行过程中发生故障,一致性仍能得到保持。

6.2.3答案1若题目是:<START U>; <U,A,10>; <START T> ….则答案是a)首先扫描日志,发现事务T和U都未commit,将其连接到未完成事务列.按照未完成事务列,从后往前逐步扫描日志并执行undo操作,按照<U,A,10>将磁盘中A值写为10,将<ABORT T>和<ABORT U>写入日志中并刷新日志。

b)首先扫描日志,发现事务T已经commit,将其连接到已完成事务列,事务U未完成,将其连接到未完成事务列。

按照未完成事务列,从后往前扫描日志执行undo操作,按照<U,C,30>将磁盘中C值写为30,<U,A,10>将磁盘A值写为10。

将<ABORT U>写入日志中并刷新日志。

c)首先扫描日志,发现事务T已经commit,将其连接到已完成事务列,事务U未完成,将其连接到未完成事务列。

按照未完成事务列从后往前扫描日志执行undo操作,按照<U,E,50>将磁盘中E值写为50,<U,C,30>将磁盘中C值写为30,<U,A,10>将磁盘A值写为10。

将<ABORT U>写入日志中并刷新日志。

d)首先扫描日志,发现事务T、U已经commit,将其连接到已完成列,未完成列为空,不做任何操作。

答案2a) <START T>事务T、U未提交,要被撤销。

向后扫描日志,遇到记录<U,A,10>,于是将A在磁盘上的值存为10。

最后,记录<ABORT U>和<ABORT T>被写到日志中且日志被刷新。

b) <COMMIT T>事务T已提交,U未提交,要被撤销。

向后扫描日志,首先遇到记录<U,C,30>,于是将C在磁盘上的值存为30。

接着遇到记录<U,A,10>,并将A在磁盘上的值置为10。

最后,记录<ABORT U>被写到日志中且日志被刷新。

c) <U,E,50>事务T已提交,U未提交,要被撤销。

向后扫描日志,首先遇到记录<U,E,50>,将E在磁盘上的值存为50。

接着遇到记录<U,C,30>,于是将C在磁盘上的值存为30。

再遇到记录<U,A,10>,并将A在磁盘上的值置为10。

最后,记录<ABORT U>被写到日志中且日志被刷新。

d) <COMMIT U>事务T、U均被提交。

什么都不做。

6.2.46.2.7a)当前活跃的事务只有S,日志记录为<START CKPT(S)>,所以在<COMMIT S>之后写入<END CKPT>记录。

如果故障发生在<END CKPT>记录之后,那么我们可以扫描直到下一个<START CKPT(S)>记录停止。

如果故障发生在<COMMIT S>之前,那么我们要回溯到<START S>。

b) 当前活跃的事务只有T,日志记录为<START CKPT(T)>,所以在<COMMIT T>之后写入<END CKPT>记录。

如果故障发生在<END CKPT>记录之后,那么我们可以向后扫描直到下一个<START CKPT(T)>记录停止。

如果故障发生在<COMMIT T>之前,那么我们要回溯到<START T>。

c)当前活跃的事务有T和U,日志记录为<START CKPT(T,U)>,所以在<COMMIT T>之后写入<END CKPT>记录。

如果故障发生在<END CKPT>记录之后,那么我们可以向后扫描直到下一个<START CKPT(T,U)>记录停止。

如果故障发生在<COMMIT T>之前,那么我们要回溯到<START T>。

d)当前活跃的事务有T、U和V,日志记录为<START CKPT(T,U,V)>,所以在<COMMIT V>之后写入<END CKPT>记录。

如果故障发生在<END CKPT>记录之后,那么我们可以向后扫描直到下一个<START CKPT(T,U,V)>记录停止。

如果故障发生在<COMMIT V>之前,那么我们要回溯到<START T>。

e)当前活跃的事务有T和V,日志记录为<START CKPT(T,V)>,所以在<COMMIT V>之后写入<END CKPT>记录。

如果故障发生在<END CKPT>记录之后,那么我们可以向后扫描直到下一个<START CKPT(T,V)>记录停止。

如果故障发生在<COMMIT V>之前,那么我们要回溯到<START T>6.3.2a)当前活跃的事务只有S,日志记录为<START CKPT(S)>,所以在<COMMIT S>之前写入<END CKPT>记录。

如果崩溃发生在<END CKPT>记录之后,那么在日志中只要回溯到<START S>。

如果崩溃发生在<END CKPT>记录之前,我们必须向后搜索到倒数第二个START CKPT记录并得到其活跃事务列表。

在本题中没有前一检查点,因而必须一直走到日志的开头,确定没有已提交的事务。

b) 当前活跃的事务只有T,日志记录为<START CKPT(T)>,所以在<COMMIT T>之前写入<END CKPT>记录。

如果崩溃发生在<END CKPT>记录之后,那么在日志中只要回溯到<START T>。

如果崩溃发生在<END CKPT>记录之前,我们必须向后搜索到倒数第二个START CKPT记录并得到其活跃事务列表。

在本题中没有前一检查点,因而必须一直走到日志的开头,确定已提交的事务只有S,重复其动作<S,A,60>,并在恢复后将记录<ABORT T>写入日志中。

c)当前活跃的事务有T和U,日志记录为<START CKPT(T,U)>,所以在<COMMIT U>之前写入<END CKPT>记录。

如果崩溃发生在<END CKPT>记录之后,那么在日志中只要回溯到<START T>。

如果崩溃发生在<END CKPT>记录之前,我们必须向后搜索到倒数第二个START CKPT记录并得到其活跃事务列表。

在本题中没有前一检查点,因而必须一直走到日志的开头,确定已提交的事务只有S,重复其动作<S,A,60>,并在恢复后将记录<ABORT T>和<ABORT U>写入日志中。

d)当前活跃的事务有T、U和V,日志记录为<START CKPT(T,U,V)>,所以在<COMMIT U>之前写入<END CKPT>记录。

如果崩溃发生在<END CKPT>记录之后,那么在日志中只要回溯到<START T>。

如果崩溃发生在<END CKPT>记录之前,我们必须向后搜索到倒数第二个START CKPT记录并得到其活跃事务列表。

在本题中没有前一检查点,因而必须一直走到日志的开头,确定已提交的事务只有S,重复其动作<S,A,60>,并在恢复后将记录<ABORT T> 、<ABORT U>和<ABORT V>写入日志中。

e)当前活跃的事务有T和V,日志记录为<START CKPT(T,V)>,所以在<COMMIT T>之前写入<END CKPT>记录。

如果崩溃发生在<END CKPT>记录之后,那么在日志中只要回溯到<START T>。

如果崩溃发生在<END CKPT>记录之前,我们必须向后搜索到倒数第二个START CKPT记录并得到其活跃事务列表。

在本题中没有前一检查点,因而必须一直走到日志的开头,确定已提交的事务有S和U,重复其动作<S,A,60>、<U,B,20>、<U,D,40>,并在恢复后将记录<ABORT T>和<ABORT V>写入日志中。

6.4.2答案1:a)首先扫描日志,发现事务U、T均未commit,将其连接到未完成列。

按照未完成列,从后往前逐步扫描日志并执行undo操作,按照<U,A,10,11>将磁盘中A值写为10.b)首先扫描日志,发现事务T已为commit而U未commit,故将T连接到已完成列而U连接到未完成列。

按照未完成列,从后往前扫描日志,按照<U,C,30,31>将磁盘中C写为30,<U,A,10,11>将磁盘中A值写为10。

按照已完成列,从前往后扫描日志,按照<T,B,20,21>将磁盘中B写为21,<T,D,40,41>将磁盘中D写为41.c) 最后一条记录为<U,E,50,51>这时我们为E往磁盘上写入值51,但是崩溃在<COMMIT U>记录到达前发生,则E在磁盘上的值为50。

d) 最后一条记录为<COMMIT U>,这时U被认为是已提交的事务。

我们为E往磁盘上写入值51,E 已经具有值51。

答案2a) <START T> 事务U未提交,回滚U(从后往前),A的值置为10。

在日志中写入<ABORT U>记录并刷新日志。

b) <COMMIT T> 事务T已提交,重做T,将B的值置为21,D的值置为41。

事务U未提交,回滚U(从后往前),将C的值置为30,A的值置为10。

在日志中写入<ABORT U>记录并刷新日志。

c) <U,E,50,51> 事务T已提交,重做T,将B的值置为21,D的值置为41。

事务U未提交,回滚U(从后往前),将E的值置为50,C的值置为30,A的值置为10。

在日志中写入<ABORT U>记录并刷新日志。

相关主题