Podría fallar con ORA-08103: object no longer exists
.
En Oracle, los lectores y escritores no se bloquean entre sí. Lo que significa que DML y las consultas no interferirán entre sí, excepto algunos casos extraños como quedarse sin espacio para DESHACER. Pero mover un tablespace, o cualquier tipo de ALTER u otra instrucción DDL, no es una escritura normal. El modelo de control de concurrencia de múltiples versiones falla cuando ejecuta DDL, al menos para los objetos involucrados, y comienzan a suceder cosas extrañas.
Probar un movimiento grande es difícil, pero puede reproducir estos errores recorriendo una gran cantidad de pequeños cambios y consultas. En caso de que piense que esto es solo un problema teórico, he visto que estos errores ocurren en la vida real, en una base de datos de producción.
Advertencia:bucles infinitos a continuación, ya que no puedo predecir cuánto tiempo llevará reproducir este error. Pero por lo general solo me toma decenas de segundos.
--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;
/
La sesión 2 eventualmente morirá con:
ORA-08103: object no longer exists
ORA-06512: at line 6
La sesión 3 no fallará, no está consultando una partición alterada. Cada partición tiene su propio segmento y es un objeto separado que potencialmente "ya no existe".