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


Oracle 数据库中的

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

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

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

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

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

如果事务使用可序列化隔离级别,并且插入发生在与选择不同的会话中,则更改仅对提交更改后事务开始的其他会话可见。 如果会话 A 和 B 都在时间 0 启动可序列化事务,A 在时间 1 插入一行,B 在时间 2 查询数据,则 B 将在时间 0 看到数据的状态,并且在提交事务之前不会看到在时间 1 插入的数据。 请注意,这仅适用于两个语句位于不同的会话中 - 会话 A 将看到该行,因为它已插入到 A 的事务中。

除非存在隔离级别问题,否则我希望SELECT在提交INSERT后实际上并未运行。