![](/img/trans.png)
[英]Mysql DDL query stuck in Waiting for table metadata lock when wrapped in transaction
[英]A distributed transaction is waiting for lock
我试图将列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 的分布式锁定超时秒数。
*行动:视为僵局
我尝试运行以下查询来单独更新一行:
UPDATE MY_TABLE
SET NEW_COL = OLD_COL
WHERE ID = '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
命令时,您需要重新启动实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.