我正在尝试将列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 dispatch_lock_timeout秒。
*动作:被视为僵局
我试图运行以下查询来单独更新一行:
UPDATE MY_TABLE
SET NEW_COL = OLD_COL
WHERE ID = '1'
这可以按预期工作。
因此,为什么不能更新表中的所有行?为什么会显示此错误?
答案 0 :(得分:1)
由于表中的行太多,因此ALTER SYSTEM SET distributed_lock_timeout=120;
表将被锁定。
oracle默认将其设置为60秒。如果您的执行时间超过60秒将是错误的。
您可以尝试设置超时值
ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;
或禁用它。
ALTER SYSTEM
https://docs.oracle.com/cd/A84870_01/doc/server.816/a76960/ds_txnma.htm
注意: