Oracle(通常是 RDB?)是否拍摄受 DML 影响的 table 的快照?

Does Oracle (RDB in general?) take a snapshot of the table affected by DML?

Objective

在针对 table 处理 DML 时了解 mechanism/implementation。数据库(我在 Oracle 11G R2 上工作)是否拍摄 table 的快照(针对每个 DML)以应用 DML?

背景

I 运行 a SQL 用源 table.[=16= 中的新值更新包含旧值的目标 table 的 AID 字段]

UPDATE CASES1 t
SET t.AID=(
  SELECT DISTINCT NID
  FROM REF1
  WHERE
    oid=t.aid
)
WHERE EXISTS (
  SELECT 1
  FROM REF1
  WHERE oid=t.aid
);

我认为 'OLD01' 可以更新两次(OLD01 -> NEW01 -> SCREWED)。

然而,这并没有发生。

问题

对于每个 DML,数据库是否为 DML(第 1 个)拍摄 table X(称为 X+1)的快照,然后继续拍摄结果的快照(称为 X+2) (X+1) 对于 table 上的下一个 DML(第 2 个),对于成功执行的每个 DML 依此类推?这是否也用作实现Rollback/Commit的机制?

这是在某处指定为标准的预期行为吗?如果是这样,请提供相关参考资料。我用谷歌搜索但不确定应该使用哪些关键词才能获得正确的结果。

在此先感谢您的帮助。


更新

开始阅读 Jonathan Lewis 的 Oracle Core (ISBN 9781430239543) 并看到了图表。所以目前的理解是,UNDO 记录是在 UNDO tablespace 中为每次更新创建的,原始数据是从那里重建的,我最初认为是快照。

在 Oracle 中,如果您 运行 在同一会话中连续更新两次,使用您所显示的数据,我相信您应该会得到预期的结果。我想你一定是在某个地方偏离了轨道。 (例如,如果您执行了一次更新,然后在没有提交的情况下打开了第二个会话并再次执行了相同的更新,那么您的结果就有意义了。)

从概念上讲,我认为您的问题的答案是肯定的(具体来说就是 Oracle)。 SQL 语句在语句开始执行时有效地对 table 的快照进行操作。在 Oracle 中,这个的正确术语是读一致性。但是,它的机制不涉及在进行更改之前拍摄整个 table 的快照。恰恰相反——更改的记录保存在撤消段中,并用于根据需要将 table 的块恢复到适当的时间点。

为了更深入地理解这一点,您应该查看的文档位于 Oracle 概念手册中:http://docs.oracle.com/cd/E11882_01/server.112/e40540/part_txn.htm#CHDJIGBH