ORA-08103: object no longer exists
で失敗する可能性があります 。
Oracleでは、リーダーとライターは互いにブロックしません。つまり、UNDOスペースが不足するなどのいくつかの奇妙なケースを除いて、DMLとクエリは互いに干渉しません。ただし、表領域、または任意のタイプのALTERまたはその他のDDLステートメントの移動は、通常の書き込みではありません。マルチバージョン同時実行制御モデルは、少なくとも関連するオブジェクトに対してDDLを実行すると機能しなくなり、奇妙なことが起こり始めます。
大きな動きをテストすることは困難ですが、多くの小さな変更やクエリをループすることで、これらのエラーを再現できます。これが理論上の問題にすぎないと思われる場合は、これらのエラーが実際の本番データベースで発生するのを見てきました。
警告:このエラーの再現にかかる時間を予測できないため、以下の無限ループ。しかし、通常は数十秒しかかかりません。
--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;
--Session 1
begin
loop
execute immediate '
insert /*+ append */ into test1 select mod(level,2)+1, level
from dual connect by level <= 100000';
commit;
execute immediate 'alter table test1 move partition p1 tablespace users';
end loop;
end;
/
--Session 2: Read from moved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 1;
end loop;
end;
/
--Session 3: Read from unmoved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 2;
end loop;
end;
/
セッション2は最終的に次のように終了します:
ORA-08103: object no longer exists
ORA-06512: at line 6
セッション3は失敗せず、変更されたパーティションを照会していません。各パーティションには独自のセグメントがあり、「存在しなくなる」可能性のある個別のオブジェクトです。