Есть ли обходной путь для устранения взаимоблокировки без уничтожения сеанса?
Убрать взаимоблокировку, не убивая сессию
Ответы (3)
Oracle автоматически обнаруживает тупиковые ситуации и разрешает их, откатывая одну из инструкций, участвующих в тупиковой ситуации, тем самым освобождая один набор конфликтующих блокировок строк.
Вам не нужно ничего делать, чтобы устранить взаимоблокировку, Oracle позаботится об этом автоматически. Сеанс не уничтожается, он откатывается к точке непосредственно перед оператором триггера. Другой сеанс не затрагивается (т. е. он все еще ожидает блокировки до тех пор, пока сеанс с откатом не зафиксирует или не откатит свою транзакцию).
В большинстве ситуаций взаимоблокировки должны быть исключительно редкими. Вы можете предотвратить все взаимоблокировки, используя инструкции FOR UPDATE NOWAIT вместо FOR UPDATE.
Смотрите также
Взаимоблокировки автоматически устраняются в Oracle путем отмены одного из заблокированных операторов. Вам не нужно делать это вручную. Один из сеансов получит «ORA-00060», и он должен решить, следует ли повторить попытку или выполнить откат.
Но из вашего описания похоже, что у вас блокировка, а не тупик.
В любом случае, блокирующий сеанс должен каким-то образом освободить свою блокировку - зафиксировав или откатив свою транзакцию. Можно просто подождать (возможно, долго). Если вы можете изменить код своего приложения - вы, вероятно, можете переписать его, чтобы снять блокировку или избежать ее. В противном случае вам придется убить сеанс, чтобы немедленно разблокировать ресурсы.
Нет, на практике Oracle 10g не разрешает взаимоблокировки автоматически. У нас были блокировки, и нам приходилось очищать сеансы вручную.
Эта страница может помочь определить, есть ли у вас взаимоблокировки