代码之家  ›  专栏  ›  技术社区  ›  dbza

此更新是否会导致oracle 10g中的死锁

  •  0
  • dbza  · 技术社区  · 9 年前

    我遇到了这个更新语句,想知道内部工作情况如何。它更新了一个列,该列也在更新的where子句中使用。

    理想情况下,这应该分两步完成,还是oracle会自动处理?

    UPDATE TBL1 SET DATE1=DATE2 WHERE DATE2> DATE1

    1 回复  |  直到 9 年前
        1
  •  2
  •   Jeffrey Kemp    9 年前

    Oracle会自动处理它。Oracle在运行更新时有效地执行以下步骤:

    1. 查询表-即计算表中每一行的WHERE子句谓词

    2. 对于步骤1返回的每一行,根据SET子句更新它。每列的值都是已获取的值。

    因此,完全可以运行这样的更新,以交换列的值:

    UPDATE TBL1 SET DATE1=DATE2, DATE2=DATE1 WHERE DATE2 > DATE1;
    

    如果另一个会话尝试更新或删除同一行中的一行,则可能会阻止更新。死锁是可能的,但Oracle通过回滚其中一个会话并引发异常来自动解决这些问题。