【问题标题】:Update a newly created row before final commit在最终提交之前更新新创建的行
【发布时间】:2009-09-14 13:03:40
【问题描述】:
insert into XYZ(col1, col2) values (1,2)
    update XYZ set ... where col1 = 1
    COMMIT

从上面的代码中可以看到,我们还没有提交我们的插入语句,我们对同一行执行了更新操作,最后我们提交了整个批次。

在这种情况下究竟会发生什么?在这种情况下是否有可能丢失数据?

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您的会话始终能够看到自己的修改,甚至在您发出提交之前

    【讨论】:

    • 其实就是有提交/回滚的要点之一。 ;)
    【解决方案2】:

    新插入的行将被更新。

    “丢失数据”的唯一方法是在提交之前中断,在这种情况下根本不会发生任何操作

    【讨论】:

      【解决方案3】:

      文森特回复中的重要词是“您的会话”。

      在您提交之前,单独的会话只会看到未修改的数据。这是读取一致性手段的一部分。

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

      【讨论】:

        【解决方案4】:

        为了进一步阅读,这里是优秀的 Oracle 概念指南 10gR2 的“数据并发和一致性”部分的链接

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

        【讨论】:

          【解决方案5】:

          事实上,所有事务都存储在 Rollback Segmant 中,并存储在该特定实例的表空间内存中。回滚段是表空间中的存储空间,用于保存事务信息,用于在 ROLLBACK 期间保证数据完整性并用于提供读取跨多个事务的一致性。

          【讨论】:

          • 什么是“表空间内存”?
          猜你喜欢
          • 2017-03-30
          • 2015-08-03
          • 2021-01-17
          • 1970-01-01
          • 2019-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-21
          相关资源
          最近更新 更多