Как найти заблокированные строки в Oracle

У нас есть база данных Oracle, и таблица клиентского счета имеет приблизительно миллион строк. За эти годы мы создали четыре различных UIs (два в Формах Oracle, два в .NET), все из которых остаются используемыми. У нас есть много фоновых задач (и персистентный и запланированный) также.

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

У нас есть причина полагать, что это могло бы быть неправильно себя ведущим UI, но не было в состоянии найти "дымящееся оружие".

Я нашел некоторые запросы, которые перечисляют блоки, но это для того, когда у Вас есть два задания, борющиеся за строку. Я хочу знать, какие строки имеют блокировки, когда существует не обязательно вторая работа, пытающаяся получить блокировку.

Мы находимся на 11 г, но испытывали проблему с тех пор 8i.

15
задан ehymel 2 February 2010 в 19:09
поделиться

3 ответа

Концепция блокировки Oracle сильно отличается от других систем.

Когда строка в Oracle блокируется, сама запись обновляется новым значением (если есть) и, кроме того, блокировкой (которая, по сути, является указателем на блокировку транзакции, которая находится в сегмент отката) помещается прямо в запись.

Это означает, что блокировка записи в Oracle означает обновление метаданных записи и выполнение логической записи страницы. Например, вы не можете выполнить SELECT FOR UPDATE в табличном пространстве, доступном только для чтения.

Более того, сами записи не обновляются после фиксации: вместо этого обновляется сегмент отката.

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

Oracle не имеет традиционного диспетчера блокировок, а это означает, что получение списка всех блокировок требует сканирования всех записей во всех объектах. Это займет слишком много времени.

Вы можете получить некоторые специальные блокировки, такие как заблокированные объекты метаданных (используя v $ locked_object ), ожидания блокировок (используя v $ session ) и т. Д., Но не список всех блокировок. на всех объектах в базе данных.

12
ответ дан 1 December 2019 в 02:37
поделиться

Посмотрите на dba_waiters , dba_waiters и dba_locks для блокировки. Имена должны быть самоснабженными.

Вы можете создать работу, которая проходит, скажем, раз в минуту и ​​зарегистрирована значения в DBA_BLOCKERS и текущем активном SQL_ID для этого сеанса. (через V $ Session и V $ SQLSTATS ).

Вы также можете посмотреть в v $ sql_monitor . Это будет журнал по умолчанию все SQL, который занимает дольше 5 секунд. Он также виден на странице «SQL Monitoring» в менеджере предприятия.

6
ответ дан 1 December 2019 в 02:37
поделиться

, а не замки, я предлагаю вам посмотреть на длительные транзакции , используя в $ транзакции . Оттуда вы можете присоединиться к сессии V $ Session , что должно дать вам представление о UI (попробуйте программу и столбцы машин), а также пользователю.

5
ответ дан 1 December 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: