Може да се провали с ORA-08103: object no longer exists
.
В Oracle читателите и писателите не се блокират взаимно. Което означава, че DML и заявките няма да си пречат, с изключение на няколко странни случая като изчерпване на UNDO място. Но преместването на таблично пространство или какъвто и да е тип 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 няма да се провали, тя не прави заявка за променен дял. Всеки дял има свой собствен сегмент и е отделен обект, който потенциално може да „вече не съществува“.