【发布时间】:2009-09-14 13:03:40
【问题描述】:
insert into XYZ(col1, col2) values (1,2)
update XYZ set ... where col1 = 1
COMMIT
从上面的代码中可以看到,我们还没有提交我们的插入语句,我们对同一行执行了更新操作,最后我们提交了整个批次。
在这种情况下究竟会发生什么?在这种情况下是否有可能丢失数据?
【问题讨论】:
insert into XYZ(col1, col2) values (1,2)
update XYZ set ... where col1 = 1
COMMIT
从上面的代码中可以看到,我们还没有提交我们的插入语句,我们对同一行执行了更新操作,最后我们提交了整个批次。
在这种情况下究竟会发生什么?在这种情况下是否有可能丢失数据?
【问题讨论】:
您的会话始终能够看到自己的修改,甚至在您发出提交之前。
【讨论】:
新插入的行将被更新。
“丢失数据”的唯一方法是在提交之前中断,在这种情况下根本不会发生任何操作
【讨论】:
文森特回复中的重要词是“您的会话”。
在您提交之前,单独的会话只会看到未修改的数据。这是读取一致性手段的一部分。
根据您使用的框架和工具,您的会话可能会在您执行更新时锁定记录,从而阻止其他会话在您提交或回滚之前对其进行更新。
【讨论】:
为了进一步阅读,这里是优秀的 Oracle 概念指南 10gR2 的“数据并发和一致性”部分的链接
http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm
【讨论】:
事实上,所有事务都存储在 Rollback Segmant 中,并存储在该特定实例的表空间内存中。回滚段是表空间中的存储空间,用于保存事务信息,用于在 ROLLBACK 期间保证数据完整性并用于提供读取跨多个事务的一致性。
【讨论】: