【问题标题】:Can this update cause a deadlock in oracle 10g此更新是否会导致 oracle 10g 中的死锁
【发布时间】:2015-12-16 02:49:16
【问题描述】:

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

最好分两步完成,还是 oracle 会自动处理?

UPDATE TBL1 SET DATE1=DATE2 WHERE DATE2> DATE1

【问题讨论】:

  • 应该可以:更改都在单个事务中。
  • 在这种情况下,WHERE 仅引用行本身,并在更新行之前进行评估。但我相信这也适用于更复杂的情况。

标签: oracle deadlock isolation-level database-deadlocks


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2017-03-17
    相关资源
    最近更新 更多