先决条件:
- 并发控制简介
- 日程类型
如前所述,由于硬件故障、系统崩溃或软件问题,事务可能无法完全执行。在这种情况下,我们必须回滚失败的事务。但是其他一些交易也可能使用了失败交易产生的值。所以我们也必须回滚这些事务。
可恢复的时间表:
- 事务仅在它们读取其更改的所有事务提交之后才提交的调度称为可恢复调度。换句话说,如果一些事务T j被读取值来更新或通过一些其它的事务T I写入,则提交T J的后提交T I的必须发生。
示例 1:S1: R1(x), W1(x), R2(x), R1(y), R2(y), W2(x), W1(y), C1, C2;
给定的时间表遵循Ti->Tj => C1->C2 的顺序。事务 T1 在 T2 之前执行,因此不会发生冲突。 R1(x) 出现在 W1(x) 之前,事务 T1 在 T2 之前提交,即第一个事务的完成对数据项 x 执行第一次更新,因此给定的时间表是可恢复的。
示例 2:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) W(A) R(A) commit commit 这是一个可恢复的调度,因为 T 1在 T 2之前提交,这使得 T 2读取的值正确。
不可恢复的时间表:
- 下表显示了具有两个事务的调度,T1 读取和写入 A,该值由 T2 读取和写入。 T2 提交。但后来,T1 失败了。所以我们必须回滚T1。由于T2已经读取了T1写入的值,所以也应该回滚。但我们已经承诺了。所以这个时间表是不可恢复的时间表。当 Tj 正在读取 Ti 更新的值并且 Tj 在提交 Ti 之前提交时,调度将不可恢复。
可通过级联回滚恢复:
- 下表显示了具有两个事务的调度,T1 读取和写入 A,该值由 T2 读取和写入。但后来,T1 失败了。所以我们必须回滚T1。由于T2已经读取了T1写入的值,所以也应该回滚。由于它没有提交,我们也可以回滚 T2。所以它可以通过级联回滚来恢复。因此,如果 Tj 正在读取由 Ti 更新的值并且 Tj 的提交延迟到 Ti 的提交,则调度称为可恢复的级联回滚。
无级联可恢复回滚:
- 下表显示了具有两个事务的调度,T1 读取和写入 A 并提交,并且该值由 T2 读取。但是如果 T1 在提交之前失败,则没有其他事务读取其值,因此无需回滚其他事务。所以这是一个 Cascadeless 可恢复计划。因此,如果 Tj 仅在 Ti 提交后读取 Ti 更新的值,则调度将是无级联可恢复的。
问题:以下哪种情况可能导致数据库系统出现不可恢复的错误?
- 事务在被未提交的事务读取后写入数据项。
- 事务在被未提交的事务读取后读取数据项。
- 事务在提交的事务写入后读取数据项。
- 事务在未提交的事务写入后读取数据项。
答:参见表1中讨论的例子,一个事务正在读取一个未提交的事务写入后的数据项,调度将不可恢复。
相关帖子:
冲突可串行化