Pengecualian yang Anda lihat adalah konsekuensi langsung dari penggunaan serialisasi yang ketat. Jika Anda memiliki lebih dari satu transaksi yang aktif secara bersamaan, masing-masing dimulai dengan SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, ketika salah satu dari mereka melakukan yang lain akan mendapatkan ORA-08177. Begitulah serialisasi yang ketat ditegakkan - database melempar ORA-08177 di sesi apa pun yang dimulai dengan ISOLATION LEVEL SERIALIZABLE jika transaksi lain dilakukan ke dalam tabel yang dibutuhkan sesi serializable. Jadi, pada dasarnya, jika Anda benar-benar membutuhkan serialisasi yang ketat, Anda harus menangani ORA-08177 dengan cerdas, seperti berikut:
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;
Serialisasi bukanlah keajaiban, dan itu bukan "gratis" (di mana "gratis" berarti "Saya sebagai pengembang tidak perlu melakukan apa pun untuk membuatnya berfungsi dengan baik"). Dibutuhkan lebih banyak perencanaan dan kerja di pihak pengembang agar berfungsi dengan baik, bukan kurang. Bagikan dan nikmati.