У меня есть пакет DB 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
На этой таблице нет никаких растровых индексов, таким образом, это не причина. Насколько я могу сказать, отсутствие "Rows, которого ожидают на" плюс "S" в Официанте, ожидает, столбец, вероятно, указывает, что это - мертвая блокировка ITL. Кроме того, таблица записана в довольно часто (примерно 8 вставляют или обновления одновременно, так же часто как 240 раз в минуту), таким образом, мертвая блокировка ITL походит на большую вероятность.
Я увеличил параметр INITRANS таблицы, и это - индексы к 100 и увеличилось, PCT_FREE на таблице от 10 до 20 (затем восстановил индексы), но мертвые блокировки все еще происходят. Мертвая блокировка, кажется, происходит чаще всего во время обновления, но это могло просто быть совпадением, поскольку я только проследил ее пару раз.
Мои вопросы являются двукратными:
1) Это - на самом деле мертвая блокировка ITL?
2) Если это - мертвая блокировка ITL, что еще может быть сделано для предотвращения его?
Оказывается, что это не было проблемой мертвой блокировки ITL вообще, а скорее проблемой с неиндексируемыми внешними ключами. Я обнаружил это благодаря ответу dpbradley, который хорошо осведомленный меня в то, что это не было проблемой ITL и предложило мне узнавать, каковы другие причины мертвой блокировки с "никакими строками" могли бы быть.
Лучшим показателем давления ITL являются представления производительности:
select event, total_waits, time_waited, average_wait
from v$system_event
where event like 'enq: TX%'
order by 2 desc;
показывает TX contention waits, и
select OBJECT_NAME, SUBOBJECT_NAME, TABLESPACE_NAME,
OBJECT_TYPE, STATISTIC_NAME, VALUE
from v$segment_statistics
where statistic_name = 'ITL waits'
and value > 0
order by value desc;
показывает задействованные таблицы и индексы.
(Как и все представления v$
, результаты относятся к моменту запуска экземпляра)
Если это показывает, что у вас действительно есть ожидание ITL, тогда параметры INITRANS и PCTFREE являются основными ручками для поворота (но INITRANS = 100 звучит довольно высоко для меня, и они стоят места).
Если ожидание ITL не является проблемой, тогда необходимо изучить код приложения.