需要数据库恢复的情况,单个事务回滚

  • Post author:
  • Post category:其他

1.代数 A 的冗余

对于代数 A {NOT, AND, OR}(否定、析取和合取)的运算,与经典布尔逻辑中相同的恒等式有效。
众所周知,这个集合是传统的,但多余的,因为身份
A AND B = NOT (NOT A OR NOT B)和
A OR B = NOT (NOT A AND NOT B)。

事实证明,代数 A 的操作 <NOT>、<AND> 和 <OR> 具有相似的恒等式。
因此,在代数 A 的一组基本运算中,可以留下运算 <AND> 和 <NOT>(或 <OR> 和 <NOT>)。
这是根据定义检查的:

A AND B = NOT (NOT A OR NOT B)

A OR B = NOT (NOT A AND NOT B)

此外,对于代数 A 的运算,有 Schaeffer 素数和 Pierce 箭头的类似物:

<sh> (r1, r2) = <NOT> r1 <OR> <NOT> r2

<pi> (r1, r2) = <NOT> r1 <AND> <NOT> r2

因此,我们可以将代数 A 的操作集简化为三个操作:<sh>(或 <pi>)、<RENAME> 和 <REMOVE>。

2.以下情况可能需要恢复数据库的状态:

  • 单个事务回滚。回滚事务的一个简单情况是使用 ROLLBACK 语句显式终止事务。在某些情况下,事务回滚是由系统发起的。示例可能是应用程序中发生异常(例如,除以零)或同步死锁中断时选择事务作为牺牲品。为了在事务单独回滚时恢复一致的数据库状态,必须消除在该事务中执行的数据库修改语句的影响。
  • RAM 内容突然丢失后恢复(软故障)。这种情况可能发生在电源紧急关闭期间,在不可恢复的处理器故障(例如,主存储器控制的操作)等情况下。这种情况的特点是丢失发生故障时 DBMS RAM 缓冲区中包含的那部分数据库。
  • 从主外部数据库介质故障(硬故障)中恢复。鉴于现代外部存储设备具有足够高的可靠性,这种情况可能相对很少发生,但是即使在这种情况下,DBMS 也应该能够恢复数据库。恢复的基础是备份副本和数据库更改日志。

在这三种情况下,恢复的基础是冗余数据的存储。这些冗余数据存储在包含一系列数据库更改记录的日志中。
记录信息有两个主要选项。在第一个选项中,对于每个事务,该事务都维护一个单独的本地数据库更改日志。这些本地日志用于单个事务回滚,并且可以在 DBMS 的主(或者更确切地说,虚拟)内存中维护。此外,还维护了一个共享的数据库更改日志,用于在软硬故障后恢复数据库的状态。
为了确保事务可以在常规日志中单独回滚,来自给定事务的所有日志条目都链接到反向列表中。

待处理事务列表的顶部是该事务最后一次数据库更改的记录。请注意,在这种情况下,按时间顺序排列的最新记录可能尚未推送到外部日志内存中,并且可能位于主内存缓冲区中。对于已完成的事务,列表的开头是关于事务结束的记录,它必然被推送到外部日志内存中,即整个列表都在外部存储器中。列表的末尾始终是给定事务所做的数据库更改的第一条记录。

通常,每个条目都附加一个唯一的事务 ID,以便可以恢复该事务的数据库更改记录的直接列表。

因此,事务的单个回滚执行如下:

  • 从该事务的列表中选择下一个日志条目。
  • 执行相反的操作:执行相应的DELETE操作代替INSERT操作,执行INSERT操作代替DELETE操作,执行反向UPDATE操作代替直接UPDATE操作,恢复数据库之前的状态目的。
  • 还会记录任何这些逆运算。对于单个回滚来说,这并不是真正必要的,但是当一个事务被单独回滚时,可能会发生软故障,从中恢复将需要您回滚未完全单独回滚的事务。
  • 如果回滚成功,则记录事务结束的记录。从日志的角度来看,这样的事务被提交了。