Oracle DB 在执行 COMMIT 期间是否真正隔离?

Is Oracle DB truly isolated during execution of COMMIT?

考虑这两笔交易:

INSERT INTO foo VALUES (1, 2, 'bar');
INSERT INTO foo VALUES (1, 4, 'xyz');
COMMIT;

SELECT * FROM foo;

是否有任何时间点 SELECT 只会看到从第一个事务插入的一行?

到目前为止,我找不到任何证据表明只有在 COMMIT 成功完成后数据才可见。当 Oracle 在提交期间写入重做日志时,它以串行方式写入,对吗?所以有一点写了第一行,但没有写第二行。由于在 Oracle 中编写器不会阻止读取器,因此如果 select 恰好命中此 window,则它只会看到一行。还是有其他的锁定机制?

没有。 提交成功后数据才会存在。

ATOMICITY

当然在同一个会话中你可以看到未提交的数据 例如:

INSERT INTO foo VALUES (1, 2, 'bar');
SELECT * FROM foo;
INSERT INTO foo VALUES (1, 4, 'xyz');
COMMIT;

即使提交尚未执行,select 也会显示插入的数据。

没有。不可能只看到一行。

我没有确切的实施细节,但主要思想是每条记录都关联了最后修改的交易编号。当其他事务读取数据时,它会检查最后修改的记录事务的状态(以及它们自己的隔离级别)并只获取允许的记录。 (这对于任何 MVCC 数据库都很常见)

此外,即使获取事务具有 RC 隔离级别,每个查询在执行之前都会对当前活动的事务状态进行快照,并使用它来执行上面的检查。这实际上意味着每个查询都在 SNAPSHOT 隔离级别中运行。 (这是 Oracle 的特定功能)

此处有更多详细信息:https://docs.oracle.com/cd/E25054_01/server.1111/e25789/consist.htm

检查多版本读取和语句级读取一致性部分。