Ошибка ORA-08177: can't serialize access for this transaction
Причины возникновения ошибки:
ORA-08177: can't serialize access for this transaction
Возникает при установленном уровне транзакции «serializable»
alter session set isolation_level=serializable;
В Oracle DB по умолчанию стоит уровень изолированности транзакций «READ COMMITTED». Для 99% процентов случаев его хватает. Поэтому для устранения проблемы надо вернуть уровень по умолчанию.
alter session set isolation_level=READ COMMITTED;
Ниже код с помощью, которого можно воспроизвести ошибку
-- устанавливаем уровень изолированности транзакции "SERIALIZABLE" COMMIT; ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE; <p>-- создаем тестовую таблицу #b1b100;">RETURN NUMBER IS E_CANT_SERIALIZE EXCEPTION; PRAGMA EXCEPTION_INIT(E_CANT_SERIALIZE, -#cc66cc;">8177);</p><p> PROCEDURE DO_UPDATE IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN UPDATE TRAN_TEST SET N=N; COMMIT; END; BEGIN DO_UPDATE; UPDATE TRAN_TEST SET N=N; END TEST_IL; /</p><p>DECLARE L_N NUMBER; BEGIN L_N:=TEST_IL; DBMS_OUTPUT.PUT_LINE('IN SERIALIZABLE: '||L_N); COMMIT; ALTER SESSION SET ISOLATION_LEVEL=READ COMMITTED; </p>
Источники
http://oracle-inf.narod.ru/transac.html
https://oracle-patches.com/oracle/begin/3022-%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B8-%D0%B8%D0%B7%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%B8-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9-oracle-%D0%B8-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82-iso
https://oracle-patches.com/oracle/prof/3200-%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8-%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D1%8B-undo-%D0%B2-%D0%B1%D0%B0%D0%B7%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-oracle
https://www.sql.ru/forum/310620/isolation-level