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

分布式事务正在等待锁定

  •  1
  • Rexam  · 技术社区  · 8 年前

    我正试图复制列中的所有值 OLD_COL 进入另一列 NEW_COL 在同一张桌子里。 为了达到我想要的结果,我写下了 UPDATE 在Oracle中:

    UPDATE MY_TABLE
       SET NEW_COL = OLD_COL
       WHERE NEW_COL IS NULL;
    

    在哪里? MY_TABLE 是一个由400.000行组成的大表。
    当我尝试运行它时,它失败并出现错误:

    QL错误:ORA-02049:超时:分布式事务等待锁定
    02049年。00000-“超时:分布式事务等待锁定”
    *原因:超过init.ora distributed_lock_等待锁定的超时秒数。
    *操作:视为死锁

    我试图运行以下查询来单独更新一行:

    UPDATE MY_TABLE
       SET NEW_COL = OLD_COL
       WHERE ID = '1'
    

    这是按计划进行的。
    因此,为什么我不能更新表中的所有行?为什么会出现这个错误?

    1 回复  |  直到 8 年前
        1
  •  2
  •   D-Shih    8 年前

    因为你的表中有太多的行,当你 UPDATE 桌子会锁上的。 Oracle默认设置为60秒。如果你的执行时间超过60秒将是错误的。

    您可以尝试设置超时值

    ALTER SYSTEM SET distributed_lock_timeout=120;
    

    或者禁用它。

    ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;
    

    https://docs.oracle.com/cd/A84870_01/doc/server.816/a76960/ds_txnma.htm

    注:

    • 记住:在运行任何 ALTER SYSTEM 命令重新启动实例。