Ошибка ORA-08177: can't serialize access for this transaction

Причины возникновения ошибки:

  1. ORA-08177: can't serialize access for this transaction
  2.  

Возникает при установленном уровне транзакции «serializable»

  1. alter session set isolation_level=serializable;
  2.  

В Oracle DB по умолчанию стоит уровень изолированности транзакций «READ COMMITTED». Для 99% процентов случаев его хватает. Поэтому для устранения проблемы надо вернуть уровень по умолчанию.

  1. alter session set isolation_level=READ COMMITTED;
  2.  

Ниже код с помощью, которого можно воспроизвести ошибку

  1. -- устанавливаем уровень изолированности транзакции "SERIALIZABLE"
  2. COMMIT;
  3. ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE; <p>-- создаем тестовую таблицу
  4. CREATE TABLE TRAN_TEST (N) #b1b100;">AS
  5. SELECT #cc66cc;">1 FROM DUAL;</p><p>CREATE OR REPLACE FUNCTION TEST_IL
  6. #b1b100;">RETURN NUMBER IS
  7. E_CANT_SERIALIZE EXCEPTION;
  8. PRAGMA EXCEPTION_INIT(E_CANT_SERIALIZE, -#cc66cc;">8177);</p><p> PROCEDURE DO_UPDATE IS PRAGMA AUTONOMOUS_TRANSACTION;
  9. BEGIN
  10. UPDATE TRAN_TEST SET N=N;
  11. COMMIT;
  12. END;
  13.  
  14. BEGIN
  15. DO_UPDATE;
  16. UPDATE TRAN_TEST
  17. SET N=N;
  18. #b1b100;">RETURN #cc66cc;">0;
  19. EXCEPTION WHEN E_CANT_SERIALIZE THEN #b1b100;">RETURN #cc66cc;">1;
  20. END TEST_IL;
  21. /</p><p>DECLARE
  22. L_N NUMBER;
  23. BEGIN
  24. L_N:=TEST_IL;
  25. DBMS_OUTPUT.PUT_LINE('IN SERIALIZABLE: '||L_N);
  26. END;</p><p>-- возвращаем уровень изолированности транзакции по умолчанию "READ COMMITTED"
  27. COMMIT;
  28. ALTER SESSION SET ISOLATION_LEVEL=READ COMMITTED;
  29. </p>
14:05
4.94K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.