Nó có thể không thành công với ORA-08103: object no longer exists
.
Trong Oracle, người đọc và người viết không chặn lẫn nhau. Có nghĩa là DML và các truy vấn sẽ không can thiệp vào nhau, loại trừ một số trường hợp kỳ lạ như hết dung lượng UNDO. Nhưng việc di chuyển một vùng bảng, hoặc bất kỳ loại ALTER hoặc câu lệnh DDL nào khác, không phải là một hành động ghi bình thường. Mô hình điều khiển đồng thời đa vũ trụ bị phá vỡ khi bạn chạy DDL, ít nhất là đối với các đối tượng liên quan và những điều kỳ lạ bắt đầu xảy ra.
Việc kiểm tra một bước di chuyển lớn là rất khó, nhưng bạn có thể tái tạo những lỗi này bằng cách lặp lại nhiều thay đổi và truy vấn nhỏ. Trong trường hợp bạn nghĩ đây chỉ là vấn đề lý thuyết, tôi đã thấy những lỗi này xảy ra trong thực tế, trên cơ sở dữ liệu sản xuất.
Cảnh báo:vòng lặp vô hạn bên dưới vì tôi không thể dự đoán được sẽ mất bao lâu để tạo lại lỗi này. Nhưng tôi thường chỉ mất vài chục giây.
--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;
/
Phiên 2 cuối cùng sẽ kết thúc với:
ORA-08103: object no longer exists
ORA-06512: at line 6
Phiên 3 sẽ không thất bại, nó không truy vấn một phân vùng đã thay đổi. Mỗi phân vùng có phân đoạn riêng và là một đối tượng riêng biệt có thể "không còn tồn tại".