Det kan misslyckas med ORA-08103: object no longer exists
.
I Oracle blockerar inte läsare och skribenter varandra. Vilket innebär att DML och frågor inte kommer att störa varandra, exklusive några konstiga fall som att få slut på UNDO-utrymme. Men att flytta ett tabellutrymme, eller någon typ av ALTER eller annan DDL-sats, är inte en normal skrivning. Multiversionsmodellen för samtidighetskontroll går sönder när du kör DDL, åtminstone för de inblandade objekten, och konstiga saker börjar hända.
Att testa ett stort drag är svårt, men du kan reproducera dessa fel genom att gå igenom många små ändringar och frågor. Om du tror att detta bara är ett teoretiskt problem, har jag sett dessa fel inträffa i verkligheten, i en produktionsdatabas.
Varning:oändliga loopar nedan eftersom jag inte kan förutsäga hur lång tid det kommer att ta att återskapa detta fel. Men det brukar bara ta mig tiotals 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 kommer så småningom att dö med:
ORA-08103: object no longer exists
ORA-06512: at line 6
Session 3 kommer inte att misslyckas, den frågar inte efter en ändrad partition. Varje partition har sitt eget segment och är ett separat objekt som potentiellt "inte längre kan existera".