Найти процесс, блокурующий таблицу

mosquito2k
Дата: 20.11.2008 12:43:12
Доброго времени суток, уважаемые форумчане.
Есть такая проблема. Существует закрытая система. При ее эксплуатации возникли трудности, а именно: одна из подсистем, которая имеет самостоятельное подключение к БД, периодически (приблизительно раз в сутки) при попытки вставить новый документ выдает следующую ошибку:

[Oracle][ODBC][Ora]ORA-00054: resource busy and acquire with NOWAIT

Сняли трассу с процедуры создания и выяснили, что вылетает при попытке заблокировать таблицу:

автор
SELECT /*+FIRST_ROWS */ t.t_objecttype, t.t_codekind, t.t_objectid, t.t_code, t.t_state, t.t_bankdate, t.t_sysdate, t.t_systime, t.t_userid, t.t_branch, t.t_numsession, t.t_unique, t.t_autokey FROM dobjcode_dbt t WHERE ( t.t_autokey = :1 ) FOR UPDATE NOWAIT


То есть блокируется запись с данными по конкретному клиенту, что логично...

Вопрос, как найти процесс, который блокирует запись?

П.С. Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
tru55
Дата: 20.11.2008 12:46:11
v$lock
Oleg M.Ivanov
Дата: 20.11.2008 12:47:40
mosquito2k,
Может это поможет?
mosquito2k
Дата: 20.11.2008 13:02:13
Проблема в том, что блокировка не постоянна, то есть появляется на короткий промежуток времени... То есть найти ее путем просмотра локов, по-моему, будет тяжело...
Oleg M.Ivanov
Дата: 20.11.2008 13:09:00
mosquito2k
Проблема в том, что блокировка не постоянна, то есть появляется на короткий промежуток времени... То есть найти ее путем просмотра локов, по-моему, будет тяжело...

Тогда вот еще тема. Там это исключение предлагали обработать.
sqlplus
Дата: 20.11.2008 13:10:50
mosquito2k
Проблема в том, что блокировка не постоянна, то есть появляется на короткий промежуток времени... То есть найти ее путем просмотра локов, по-моему, будет тяжело...


Тогда смысл поиска блокирующего?
tru55
Дата: 20.11.2008 13:11:28
mosquito2k
Проблема в том, что блокировка не постоянна, то есть появляется на короткий промежуток времени... То есть найти ее путем просмотра локов, по-моему, будет тяжело...


Хм-м-м...
А ты хотел, чтобы Oracle тебе еще и блокировки журналировал? Что же делать, если приложение написано по дурацки и достаточно обычное исключение не перехватывается? Да и что ты будешь делать, если обнаружишь процесс, работающий с этой таблицей? Ведь блокировка - это штатное средство в Oracle...
mosquito2k
Дата: 20.11.2008 13:29:00
автор
Тогда смысл поиска блокирующего?

Поддержка нам прямо сказала, что решать проблему они не намерены, у них, видите-ли, все работает нормально. Смысл в том, чтобы понять отчего это происходит и попытаться этого избежать... Она достаточно критичная. Так же тогда можно будет конкретно разговаривать с поддержкой (у вас тут ошибка).
mosquito2k
Дата: 20.11.2008 13:41:10
Нашел, что можно создать триггер на ошибку... то есть конкретно на событие SERVERERROR. Возможно ли будет создать триггер на ORA-00054, который запишет текущие блокировки таблицы?
sqlplus
Дата: 20.11.2008 13:44:07
mosquito2k
автор
Тогда смысл поиска блокирующего?

Поддержка нам прямо сказала, что решать проблему они не намерены, у них, видите-ли, все работает нормально. Смысл в том, чтобы понять отчего это происходит и попытаться этого избежать... Она достаточно критичная. Так же тогда можно будет конкретно разговаривать с поддержкой (у вас тут ошибка).


Дело не в этом. У вас что - одно-пользовательская система? Причиной данной ошибки может быть любой DML в других сессиях или SELECT...FOR UPDATE на тот же ресурс. Это нормально.

Перепишите запрос на wait или нормальную обработку ошибки сделайте.