write(T1, balx), read(T2, balx), write(T1, balx), commit(T2), abort(T1)
我正在复习考试,这些是我一直在模拟试卷上查看的问题之一。
根据标记方案,答案是事务是可序列化的。但我就是不明白怎么做。
T1 和 T2 被困在一个循环中,因为 T1 指向 T2,然后在优先图中指向 T1,因此不能使其可序列化。标记是错误的还是我在这里遗漏了什么?
write(T1, balx), read(T2, balx), write(T1, balx), commit(T2), abort(T1)
我正在复习考试,这些是我一直在模拟试卷上查看的问题之一。
根据标记方案,答案是事务是可序列化的。但我就是不明白怎么做。
T1 和 T2 被困在一个循环中,因为 T1 指向 T2,然后在优先图中指向 T1,因此不能使其可序列化。标记是错误的还是我在这里遗漏了什么?
我认为这里的关键是T1 abort。如果在事务提交之前我没有弄错,那么可以安全地假设磁盘没有被修改。这意味着当 T1 中止时,数据库的状态与此操作顺序相同。这是T2正在观看的。
因此,如果我们有
write(T1, balx), write(T1, balx), abort(T1), read(T2, balx), commit(T2)
read(T2, balx), commit(T2), write(T1, balx), write(T1, balx), abort(T1)
然后数据库和事务 T2 的状态将与您的示例中的状态相同。现在,如果 T1 已提交,则通过调用优先图您将是正确的。