分布式事务正在等待锁。

4

我试图将一列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 - “timeout: distributed transaction waiting for lock”
*原因:超过INIT.ORA distributed_lock_timeout秒等待锁。
*操作:将其视为死锁

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

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

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

1个回答

4

由于您的表中行数太多,当您更新表时,表将被锁定。 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; 将其恢复为默认值,对吗? - Rexam
1
是的 ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY; COMMIT; - D-Shih
抱歉回复晚了,但显然,要运行ALTER SYSTEM语句,您需要拥有管理员特权,而我没有。但是我发现,系统中的另一个用户正在更新相同的表格,因此在我的角度下它被标记为锁定状态。在他提交后,我可以通过简单地运行上面提到过的查询来更新我的大表,而无需使用任何ALTER SYSTEM命令。 - Rexam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接