У меня есть пакет Oracle DB, который регулярно вызывает то, что я считаю тупиком ITL (список заинтересованных транзакций). Соответствующая часть файла трассировки приведена ниже.
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0000cb52-00000000 22 131 S 23 143 SS
TM-0000ceec-00000000 23 143 SX 32 138 SX SSX
TM-0000cb52-00000000 30 138 SX 22 131 S
session 131: DID 0001-0016-00000D1C session 143: DID 0001-0017-000055D5
session 143: DID 0001-0017-000055D5 session 138: DID 0001-001E-000067A0
session 138: DID 0001-001E-000067A0 session 131: DID 0001-0016-00000D1C
Rows waited on:
Session 143: no row
Session 138: no row
Session 131: no row
В этой таблице нет битовых индексов, так что причина не в этом. Насколько я могу судить, отсутствие «ожидаемых строк» плюс «S» в столбце ожидания официанта, вероятно, указывает на то, что это тупиковая ситуация ITL. Кроме того, запись в таблицу выполняется довольно часто (примерно 8 вставок или обновлений одновременно, до 240 раз в минуту), поэтому взаимоблокировка ITL кажется вполне возможной.
Я увеличил параметр INITRANS таблицы и ее индексов до 100 и увеличил PCT_FREE для таблицы с 10 до 20 (затем перестроил индексы), но взаимоблокировки все еще происходят. Взаимная блокировка чаще всего происходит во время обновления, но это может быть просто совпадением, так как я отследил это всего пару раз.
У меня два вопроса:
1) Действительно ли это тупиковая ситуация с МРЖО?
2) Если это тупиковая ситуация с МРЖО, что еще можно сделать, чтобы ее избежать?
Оказывается, это вовсе не проблема взаимоблокировки ITL, а скорее проблема с неиндексированными внешними ключами. Я обнаружил это благодаря ответу dpbradley, который подсказал мне, что это не проблема ITL, и побудил меня выяснить, каковы другие причины взаимоблокировки с «отсутствием строк».