Det kan mislykkes med ORA-08103: object no longer exists
.
I Oracle blokerer læsere og forfattere ikke hinanden. Hvilket betyder, at DML og forespørgsler ikke vil forstyrre hinanden, med undtagelse af nogle få mærkelige tilfælde som at løbe tør for UNDO-plads. Men at flytte et tablespace eller enhver form for ALTER eller anden DDL-sætning er ikke en normal skrivning. Multiversions samtidighedskontrolmodellen går i stykker, når du kører DDL, i det mindste for de involverede objekter, og mærkelige ting begynder at ske.
Det er svært at teste et stort træk, men du kan genskabe disse fejl ved at gennemgå en masse små ændringer og forespørgsler. Hvis du tror, at dette kun er et teoretisk problem, har jeg set disse fejl opstå i det virkelige liv i en produktionsdatabase.
Advarsel:uendelige loops nedenfor, da jeg ikke kan forudsige, hvor lang tid det vil tage at genskabe denne fejl. Men det tager mig normalt kun snesevis af sekunder.
--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;
/
Session 2 vil til sidst dø med:
ORA-08103: object no longer exists
ORA-06512: at line 6
Session 3 vil ikke mislykkes, den forespørger ikke på en ændret partition. Hver partition har sit eget segment, og er et separat objekt, der potentielt "ikke længere kan eksistere".