我有一个遗留代码,它执行以下操作:
ALTER TABLE A RENAME TO B;
ALTER TABLE C RENAME TO A;
ALTER TABLE B RENAME TO C;它正在交换两个表A和C。
问题:第三个alter table DDL抛出错误:
ORA-00054资源繁忙
我不明白在前两个DDL之后怎么会有锁?此时,每个事务都应该已经提交。
这种情况经常发生,但并不总是如此--有时有效,有时无效。
在交换过程中,不可能有其他会话更改了这些表的数据--首先是非常短的操作,其次--实际上只使用了一个表(表A),第二个更像是存档,所以没有人在上面执行任何DML。即使我们假设不太可能的情况下,有人确实设法连接并锁定了一些东西-这是如此短的时间,我可以理解如果它发生一次,但它发生在每2-3个交换之后。
毫无线索。有没有可能在重命名表后一些旧的锁仍然是活动的?
谢谢
发布于 2018-10-17 14:23:55
在第二条语句运行之后,但在第三条语句运行之前,某个其他会话可能会锁定表B (或者可能是子表或父表,或者依赖的PL/SQL包,等等)。
https://stackoverflow.com/questions/40912519
复制相似问题