【问题标题】:A distributed transaction is waiting for lock一个分布式事务正在等待锁定
【发布时间】:2018-07-13 14:23:53
【问题描述】:

我正在尝试将列 OLD_COL 中的所有值复制到同一表内的另一列 NEW_COL 中。 为了达到我想要的结果,我在Oracle中写下了以下UPDATE

UPDATE MY_TABLE
   SET NEW_COL = OLD_COL
   WHERE NEW_COL IS NULL;

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

QL 错误:ORA-02049:超时:分布式事务等待锁定
02049. 00000 - “超时:分布式事务等待锁定”
*原因:超过了 INIT.ORA 分布式锁定超时秒数等待锁定。
*Action:视为死锁

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

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

这按预期工作。
因此,为什么我不能更新表中的所有行?为什么会出现这个错误?

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案1】:

    因为你的表中有太多的行,当你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 命令时,您需要重新启动实例。

    【讨论】:

    • 那么,如果我禁用它,我可以使用ALTER SYSTEM SET distributed_lock_timeout=60; 再次将其启用为默认值,对吗?
    • ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY; COMMIT;
    • 抱歉回复晚了,但显然要运行ALTER SYSTEM 语句,您需要拥有管理员权限,而我没有。但是我发现我系统中的另一个用户正在更新同一个表,因此在我看来它被标记为锁定。然后,我可以在他提交后更新我的大表,而无需使用任何ALTER SYSTEM 命令,只需运行上面在我的问题中编写的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2011-11-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多