Ошибка 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>-- создаем тестовую таблицу
CREATE TABLE TRAN_TEST (N) AS 
SELECT 1 FROM DUAL;</p><p>CREATE OR REPLACE FUNCTION TEST_IL 
RETURN NUMBER IS
 E_CANT_SERIALIZE EXCEPTION;
 PRAGMA EXCEPTION_INIT(E_CANT_SERIALIZE, -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;
  RETURN 0;
 EXCEPTION WHEN E_CANT_SERIALIZE THEN RETURN 1;
END TEST_IL;
/</p><p>DECLARE
 L_N NUMBER;
BEGIN
 L_N:=TEST_IL;
 DBMS_OUTPUT.PUT_LINE('IN SERIALIZABLE: '||L_N);
END;</p><p>-- возвращаем уровень изолированности транзакции по умолчанию "READ COMMITTED"
COMMIT;
ALTER SESSION SET ISOLATION_LEVEL=READ COMMITTED; 
</p>
14:05
11
Нет комментариев. Ваш будет первым!
Загрузка...