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

Oracle11g 提交的更改何时对其他事务可见?,oracle11g,transactions,commit,Oracle11g,Transactions,Commit,Oracle数据库中的事务在数据库中进行更改,并提交更改。其他事务是否可能仅在几秒钟后看到执行的更改,而不是立即看到 背景: 我们有一个应用程序,它执行数据库更改,提交更改,然后立即从数据库中读取更改后的数据。然而,有时它却没有发现任何变化。当稍后通过从SQLDeveloper手动执行相同的select来重复相同的读取时,将正确返回更改的数据。数据库是独立的,而不是群集的 应用程序不直接与数据库通信,这很容易,涉及到包括MQ消息传递在内的多个层。我们已经消除了其他潜在的行为原因,如不正确的参数、

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

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

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

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

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

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


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

在我的情况下,事务B在A提交后才真正启动,因此隔离级别应该不会对此产生影响。您写的是,现在在提交和查看其他后续事务的更改之间应该几乎没有延迟。db是否确保在更改对任何后续事务可见之前未完成提交?或者,你知道延迟可以是多长时间-毫秒吗?秒?你的帖子被标记为11g,所以我想我们讨论的至少是11.1.0.x。鉴于此,假设事务在提交或事务隔离级别被读取提交后启动,则在提交完成和数据对其他事务可见之间应有0个延迟。例如,在Oracle 9.2 RAC集群中的节点之间传播数据可能存在延迟。但不在您的Oracle版本中,也不在您的单节点配置中。