Поиск DML-блокировок в Oralce

Статьи про Oracle -> Администрирование

Поиск DML-блокировок в Oralce

v:1.0 2008.12.28
Петрелевич Сергей

При отладке приложения, разработанного для одновременной работы множества пользователей с базой данных, возможна ситуация, когда приложение "висит" и ожидает чего-то.
Рассмотрим эту ситуация в СУБД Oralce.

Одной из возможных причин этой ситуации может DML-блокировка. Возникает она, например, в следующем случае.
Есть таблица А, которая хранит некую строку с данными.
Сессия 1 изменяет эту строку, но commit не делает. Сессия 2 пытается изменить эту же строку, но не может, т.к. ожидает завершения транзакции сессии 1. Пользователь, приложения, которое выполняет сессию 2 видит "зависшую" программу и не понимает, что ему делать. Понятно, что причиной этой ситуации является неверно написанная программа. Но как найти источник блокировки? Если знать заблокированный объект, в примере выше таблицу А, то можно найти и неверно написанный код программы.
Найти этот объект поможет представленный ниже скрипт.

select wait.UserName as waitUser, wait.Machine as waitMachine,
     hold.UserName as holdUser, hold.Machine as holdMachine,
     g.Mode_Requested,
     obj.name   
   from 
     dba_waiters g,
     v$session wait,
     v$session hold,
     sys.obj$ obj,
     v$session s
  where g.waiting_session=wait.SID and g.holding_session=hold.SID
   and s.sid = wait.SID
   and obj.OBJ#(+) = s.ROW_WAIT_OBJ#



Этот скрпит покажет имя пользователя, ожидающего заблокированный объект - waitUser Имя компьютера, на котором запущено приложение - waitMachine. Аналогичные данные для сессии, которая заблокировала объект - holdUser и holdMachine. Режим блокировки - Mode_Requested, и самое главное - имя заблокированного объекта - name.

Метки: v$представления   администрирование  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.