4

我有一个遗留代码正在执行以下操作:

ALTER TABLE A RENAME TO B;
ALTER TABLE C RENAME TO A;
ALTER TABLE B RENAME TO C;

它正在交换 2 个表 A 和 C。

问题:第三个alter table DDL抛出错误:

ORA-00054 资源忙

我不明白前两个 DDL 之后怎么可能有锁?此时,每个事务都应该已经提交。

它经常发生,但并非总是如此——有时有效,有时无效。

其他会话不可能在交换期间更改此表数据 - 首先这是非常短的操作,其次 - 只有一个表(表 A)真正使用,第二个更像存档,所以没有人在执行任何 DML它。即使我们假设不太可能的情况是有人确实设法连接并锁定了某些东西——它的时间太短了,我可以理解它是否发生过一次,但它发生在每 2-3 次交换之后。

我没有任何线索。重命名表后是否有可能一些旧锁仍然处于活动状态?

谢谢

4

1 回答 1

0

在第二条语句运行之后,但在第三条语句运行之前,一些其他会话可能会锁定表B(或者可能是子表或父表或依赖的 PL/SQL 包等)。

于 2018-10-17T06:23:55.473 回答