什么时候提交的更改对其他事务可见?

时间:2015-03-12 10:28:32

标签: oracle11g transactions commit

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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