提交的更改何时对其他事务可见?

When are commited changes visible to other transactions?

Oracle 数据库中的事务在数据库中进行了更改,并提交了更改。是否有可能其他事务仅在几秒钟后而不是立即看到执行的更改?

背景: 我们有一个应用程序执行数据库更改,提交它们,然后(立即)从数据库中读回更改的数据。但是,有时会发生它没有发现任何变化的情况。当稍后重复相同的读取时(通过从 SQL Developer 手动执行相同的 select),更改的数据将正确返回。数据库是独立的,不是集群的。

应用程序不直接与数据库通信,那很容易,涉及多个层(包括 MQ 消息传递)。我们已经消除了该行为的其他潜在原因(例如不正确的参数、缓存等)。现在我想消除 Oracle 数据库的意外行为作为原因。

编辑: 首先,我想强调的是,我并不是在询问其他会话是否可以看到未提交的更改。 其次,Oracle COMMIT 语句有几个修饰符,如 WRITE BATCH 或 NOWAIT。我不知道这些修改器是否会对我的问题的答案产生任何影响,但无论如何我们都没有使用它们。

假设您的会话都使用读取提交隔离级别,更改将对数据提交后启动的任何查询可见。在 RAC 的早期版本中,在一个节点上提交更改和在另一个节点上可见更改之间可能会有一个小的延迟,但是已经消除了一段时间并且您没有使用 RAC,所以大概不是这样.

如果您的事务正在使用可序列化隔离级别并且插入发生在与 select 不同的会话中,则更改将仅对事务在提交更改后开始的其他会话可见。如果会话 A 和 B 都在时间 0 开始可序列化事务,A 在时间 1 插入一行,B 在时间 2 查询数据,则 B 会在时间 0 看到数据的状态,而不会看到原来的数据在时间 1 插入,直到它提交了它的事务。请注意,这仅适用于两个语句位于不同会话中的情况——会话 A 会看到该行,因为它被插入到 A 的事务中。

除非存在隔离级别问题,否则我预计 SELECTINSERT 提交后实际上并不是 运行。