在最终落实之前更新新创建的行

在最终落实之前更新新创建的行

问题描述:

insert into XYZ(col1, col2) values (1,2) 
    update XYZ set ... where col1 = 1 
    COMMIT 

正如在上面的代码中可以看到的,我们还没有提交我们的insert语句,并且我们对同一行执行了更新操作,最后我们提交了整个批处理。在最终落实之前更新新创建的行

在这种情况下会发生什么?在这种情况下是否有机会丢失数据?

您的会话总是能看到自己的修改,甚至你的问题之前,一个承诺

+0

也就是说,事实上,提交/回滚的要点之一。 ;) – Powerlord 2009-09-14 14:35:40

新插入的行将被更新。

可以“丢失数据”的唯一方法是在提交前的中断,在这种情况下,没有行动将发生在所有

文森特的回应中的重要词语是“你的会议”。

一个单独的会话将只会看到未修改的数据,直到您提交。这是阅读一致性手段的一部分。

根据您使用的框架和工具,执行更新时,会话可能会在记录上锁定,阻止其他会话更新,直到您提交或回滚。

如要进一步了解,这里是“数据并发与一致性”的优秀的Oracle概念的部分链接指南10gR2中

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm

逸岸的所有交易都存储在回滚Segmant与表存储空间。回滚段是表空间内的存储空间,用于存放用于在ROLLBACK期间保证数据完整性的事务信息,并用于提供跨多个事务的读一致性。

+0

什么是“表空间内存”? – 2010-09-10 23:20:11