Подскажите, плиз как _снизить_вероятность_ возникновения этой
ошибки (ORA-08177).
Сразу говорю, что индекс нужен, и нужен конечно же SERIALIZABLE уровень.
Это читал:
Under some circumstances, Oracle may have insufficient history information to determine
whether a row has been updated by a "too recent" transaction....
Изменения INITRANS ничего не дают.
Для исследования предлагаю тест(это только тест — просьба не ругать):
------------------
CREATE TABLE s4_TMP
(
tip NUMBER(3),
emitent NUMBER(10)
)
TABLESPACE USERS
INITRANS 3
NOCACHE;
----------------------------------------------
CREATE INDEX SMARTPAY.S4_TMP
ON SMARTPAY.S4_TMP(EMITENT, TIP) INITRANS 3
LOGGING TABLESPACE USERS;
----------------------------------------------
CREATE OR REPLACE PROCEDURE ex
IS
i number;
err_msg VARCHAR2(255);
err_msgSQL VARCHAR2(100);
BEGIN
i := 0;
LOOP
i := i + 1;
INSERT INTO S4_TMP ( TIP, EMITENT ) VALUES ( 3, 82010002);
commit;
EXIT WHEN i=3000;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
err_msgSQL := SUBSTR(SQLERRM, 1, 100);
err_msg := 'Error i='||i||': ('||SqlCode||')'||err_msgSQL;
rollback;
raise_application_error(-20000, err_msg);
END ex;
/
------------------------------------------------
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;