У меня есть пакет БД Oracle, который обычно вызывает тупик, который я считаю 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) Это фактически тупик ITL?
2) Если это тупик ITL, что еще можно сделать, чтобы избежать этого?
Оказывается, это вовсе не проблема взаимоблокировки ITL, а проблема с неиндексированными внешними ключами. Я обнаружил это благодаря ответу dpbradley, который убедил меня в том, что это не проблема ITL, и побудил меня выяснить, какими могут быть другие причины тупика без «строк».