ORA-08177
От: AlekseyFromUral  
Дата: 16.09.03 07:29
Оценка:
Подскажите, плиз как _снизить_вероятность_ возникновения этой
ошибки (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;

BEGIN
EX;
END;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.