📜  门| GATE-CS-2015(套装3)|第 40 题

📅  最后修改于: 2021-09-26 03:38:34             🧑  作者: Mango

考虑以下涉及两个事务 T1 和 T2 的部分附表 S。仅显示了读取和写入操作。对数据项 P 的读操作用 read(P) 表示,对数据项 P 的写操作用 write(P) 表示。

Q39

假设事务 T1 在时间实例 9 之后立即失败。以下哪个陈述是正确的?
(A)必须中止 T2,然后必须重新启动 T1 和 T2 以确保事务原子性
(B) Schedule S 不可恢复,不能保证事务原子性
(C)只有T2必须被中止然后重新启动才能保证事务的原子性
(D) Schedule S 是可恢复的,可以保证原子性,其他什么都不用做答案:(乙)
解释:

如果事务失败,原子性要求事务的影响被撤消。持久性表明,一旦事务提交,其更改就无法撤消(无需运行另一个补偿事务)。
可恢复调度:A 为每组事务 Ti 和 Tj 准确调度。如果 Tj 读取了 Ti 先前写入的数据项,则 Ti 的提交操作先于 Tj 的提交操作。
中止涉及撤消操作并重做它们,因为根据时间戳它被中止。

选项(A) :必须中止 T2,然后必须重新启动 T1 和 T2,以确保事务原子性。这是不正确的,因为它说中止事务 T2,然后重做所有操作。但是不能保证这次它会成功,因为 T1 可能会再次失败。

选项(B) :Schedule S 是不可恢复的,不能保证事务的原子性。正确,根据定义,这是一个不可恢复的调度,所以现在即使我们开始一个一个地撤消操作(在 t1 失败之后)以确保事务原子性。我们仍然无法撤消已提交的事务。因此,这个调度根据定义是不可恢复的,也不是原子的,因为它使数据库处于不一致的状态。只是脏读所以不可恢复。

选项(C) :只有 T2 必须被中止,然后重新启动以确保事务原子性。这是不正确的,因为它说只中止事务 T2,然后重做所有 T2 操作。但这是脏读问题,因为它正在读取由 T1 写入的数据项 A,而 T1 未提交。这将再次成为脏读问题。所以不正确。

选项(D) :Schedule S 是可恢复的,可以保证事务的原子性,其他什么都不用做。不正确,明明说schedule s是可恢复的,但不可恢复,因为T2读取了T1写入的数据项A,T1失败并回滚,回滚时T1开始撤销所有操作,并用之前的值修改A的值但是 T2 已经提交,因此 T2 无法更改之前从 T1 中获取的 A 的读取值。

该解决方案由Nitika Bansa 提供
这个问题的测验