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

Can this update cause a deadlock in oracle 10g

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

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

UPDATE TBL1 SET DATE1=DATE2 WHERE DATE2> DATE1

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

  1. 查询 table - 即计算 table

  2. 中每一行的 WHERE 子句谓词
  3. 对于步骤 1 返回的每一行,根据 SET 子句更新它。每列的值都是被提取的值。

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

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

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