Убрать взаимоблокировку, не убивая сессию

Есть ли обходной путь для устранения взаимоблокировки без уничтожения сеанса?


person P Sharma    schedule 28.11.2009    source источник


Ответы (3)


Из Руководство по концепциям:

Oracle автоматически обнаруживает тупиковые ситуации и разрешает их, откатывая одну из инструкций, участвующих в тупиковой ситуации, тем самым освобождая один набор конфликтующих блокировок строк.

Вам не нужно ничего делать, чтобы устранить взаимоблокировку, Oracle позаботится об этом автоматически. Сеанс не уничтожается, он откатывается к точке непосредственно перед оператором триггера. Другой сеанс не затрагивается (т. е. он все еще ожидает блокировки до тех пор, пока сеанс с откатом не зафиксирует или не откатит свою транзакцию).

В большинстве ситуаций взаимоблокировки должны быть исключительно редкими. Вы можете предотвратить все взаимоблокировки, используя инструкции FOR UPDATE NOWAIT вместо FOR UPDATE.

Смотрите также

Обсуждение устранения взаимоблокировки на AskTom

person Vincent Malgrat    schedule 28.11.2009

Взаимоблокировки автоматически устраняются в Oracle путем отмены одного из заблокированных операторов. Вам не нужно делать это вручную. Один из сеансов получит «ORA-00060», и он должен решить, следует ли повторить попытку или выполнить откат.

Но из вашего описания похоже, что у вас блокировка, а не тупик.

В любом случае, блокирующий сеанс должен каким-то образом освободить свою блокировку - зафиксировав или откатив свою транзакцию. Можно просто подождать (возможно, долго). Если вы можете изменить код своего приложения - вы, вероятно, можете переписать его, чтобы снять блокировку или избежать ее. В противном случае вам придется убить сеанс, чтобы немедленно разблокировать ресурсы.

person Egor Rogov    schedule 28.11.2009

Нет, на практике Oracle 10g не разрешает взаимоблокировки автоматически. У нас были блокировки, и нам приходилось очищать сеансы вручную.

Эта страница может помочь определить, есть ли у вас взаимоблокировки

person bhoot    schedule 30.06.2011