Ngoại lệ bạn đang thấy là hệ quả trực tiếp của việc sử dụng tuần tự hóa nghiêm ngặt. Nếu bạn có nhiều giao dịch đang hoạt động đồng thời, mỗi giao dịch bắt đầu bằng THIẾT LẬP MỨC ĐỘ CẠNH TRANH GIAO DỊCH CÓ THỂ XÁC NHẬN ĐƯỢC, khi bất kỳ giao dịch nào trong số chúng cam kết với các giao dịch khác sẽ nhận được ORA-08177. Đó là cách tuần tự hóa nghiêm ngặt được thực thi - cơ sở dữ liệu ném một ORA-08177 trong bất kỳ phiên nào bắt đầu bằng ISOLATION LEVEL SERIALIZABLE nếu một giao dịch khác đi vào một bảng mà phiên có thể tuần tự hóa cần. Vì vậy, về cơ bản, nếu bạn thực sự cần tuần tự hóa nghiêm ngặt, bạn phải xử lý ORA-08177 một cách thông minh, như sau:
DECLARE
bSerializable_trans_complete BOOLEAN := FALSE;
excpSerializable EXCEPTION;
PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
<<SERIALIZABLE_LOOP>>
WHILE NOT bSerializable_trans_complete
LOOP
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
MERGE ...; -- or whatever
COMMIT;
bSerializable_trans_complete := TRUE; -- allow SERIALIZABLE_LOOP to exit
EXCEPTION
WHEN excpSerializable THEN
ROLLBACK;
CONTINUE SERIALIZABLE_LOOP;
END;
END LOOP; -- SERIALIZABLE_LOOP
END;
Serialization không phải là phép thuật và nó không phải là "miễn phí" (trong đó "miễn phí" có nghĩa là "Tôi với tư cách là nhà phát triển không phải làm bất cứ điều gì để làm cho nó hoạt động bình thường"). Nó đòi hỏi phải lập kế hoạch nhiều hơn và làm việc từ phía nhà phát triển để nó hoạt động bình thường, chứ không phải ít hơn. Chia sẻ và tận hưởng.