在我的pl \ sql进程中,执行了“alter table exchange parition ...” 在某些桌子上。
问题是在该操作期间 - 其他用户可以尝试访问目标表。
在该表上执行select查询的一个进程出现此错误: ORA-08103对象不再存在。
我认为它与'对象或视图不存在'不同。
我认为“对象不再存在”错误,当进程开始正常时,
然后交换(或其他操作)来自一方和过程
不能完成。
这种情况发生的可能性很小,因为交换非常快。
但对于这种情况,有任何想法如何解决?如何防止这种情况?
也许只有在没有人碰到桌子时才能执行交换?
感谢。
答案 0 :(得分:0)
会话#2在会话#1打开游标之后但在从该游标获取行之前更改表中的表时会发生这种情况。
除非您愿意更改其他用户用来访问目标表的代码,否则我认为有一种防止交换发生的万无一失的方法。
LOCK TABLE mytable IN EXCLUSIVE MODE
不会等待SELECT
语句完成,也不会阻止新的SELECT
语句启动,因此在尝试ALTER TABLE
之前获取排他锁将不会工作
如果您想要阻止ALTER TABLE
与SELECT
同时发生,则需要两者都依赖于获取相同的锁定。一种相对健壮的方法是使用DBMS_LOCK
包为该表分配锁。称之为锁定" mytablelock"。
然后,使用DBMS_LOCK,您的SELECT
会话需要获取" shared"锁定" mytablelock"在进步之前。您的alter table
会话需要获得"排除"锁定" mytablelock"在进步之前。
此方案允许多个SELECT
会话运行而不会相互干扰,但会阻止ALTER TABLE
在任何SELECT
运行时运行。
(很多)不太健壮但更简单的方法是将从其他查询发出的SELECT
语句更改为SELECT FOR UPDATES
。但这是许多不必要的等待和死锁错误的处方。