Поиск 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>.