甲骨文:;当用户发出更改数据项的指令时,为什么Oracle会创建一个重做更改向量来描述对撤消块的更改

甲骨文:;当用户发出更改数据项的指令时,为什么Oracle会创建一个重做更改向量来描述对撤消块的更改,oracle,Oracle,通常,当用户发出更改数据项的指令时,Oracle会通过以下四个关键步骤进行更改: 1。创建一个重做更改向量,描述对数据块的更改。 2。创建一条撤消记录,以便插入到撤消表空间中的撤消块中。 3。创建一个重做更改向量,描述对撤消块的更改。 4。更改数据块。 为什么我们需要步骤3来完成更改?假设您有一个未完成(未提交)的事务。Oracle已经完成了您在问题中所说的所有事情 现在机器崩溃了 DBA在机器恢复后(或在新机器上,取决于:)恢复最后一次备份,并将所有重做日志应用于新实例。在重做过程中,第1步也

通常,当用户发出更改数据项的指令时,Oracle会通过以下四个关键步骤进行更改:

1。创建一个重做更改向量,描述对数据块的更改。

2。创建一条撤消记录,以便插入到撤消表空间中的撤消块中。

3。创建一个重做更改向量,描述对撤消块的更改。

4。更改数据块。


为什么我们需要步骤3来完成更改?

假设您有一个未完成(未提交)的事务。Oracle已经完成了您在问题中所说的所有事情

现在机器崩溃了

DBA在机器恢复后(或在新机器上,取决于:)恢复最后一次备份,并将所有重做日志应用于新实例。在重做过程中,第1步也是这样做的。但这项工作尚未完成,因此引擎需要将其回滚。为此,它需要回滚段。但若你们并没有在步骤3中记录回滚段,那个么回滚段就不会出现


我知道你现在会问:为什么它会将日志应用于未提交的工作?当我读到它的时候,这也是我的问题。我不确定,但也许这样做比较容易。可能更难检查日志的每个条目,即它是已提交事务的一部分。但是,Oracle的工作方式是这样的:我应用所有重做日志,然后回滚未提交的事务。

为什么对未提交的工作应用日志?-原因是重做日志作为一个流工作。因此,当您阅读并应用更改向量时,您不知道是否会在最后提交更改。此外,多个事务可以更改同一数据块,而更改向量仅描述从上一个SCN到下一个SCN的更改。而且,由于数据文件是异步更新的,因此它们可能会落后许多SCN。它还涉及到提交实现方法——大多数事务预计只会提交少量回滚。@Husqvik我们可以说重做日志对事务是不可知的吗?还是因为太简单而无法应用它们?@Husqvik而且,因为您在这里,是否还有其他原因记录撤销?这是我知道的唯一原因。重做包括事务xid。您还需要撤消以实现读取一致性。当您更新一些数据时,事务仍处于活动状态,而其他会话访问同一块时,它需要能够“查看”语句/事务开始的版本。因此,它需要应用撤消更改向量来获得它。从技术上讲,原始问题中的前两个步骤也会切换。重做日志中的第一个条目是撤消条目,后面是数据块更改条目。