enq: TX - row lock contention: Ожидание: сессия заблокирована блокировкой уровня строки, удерживаемой другой транзакцией
OracleЧто это значит?
Сессия ждёт освобождения блокировки строки, удерживаемой другой транзакцией. Это классическое событие ожидания блокировки на уровне приложения.
Почему возникает?
Параллельные транзакции, пытающиеся обновить одну и ту же строку, транзакции, долго остающиеся без commit, широкие блокировки из-за неиндексированных внешних ключей или концентрация на последовательном ключе (горячий блок).
Как исправить
Найдите блокирующие и заблокированные сессии: SELECT * FROM v$session WHERE blocking_session IS NOT NULL; и сопоставьте с v$lock. Если первопричина — длительные транзакции, пересмотрите стратегию commit. Индексируйте столбцы внешних ключей. Для горячих строк пересмотрите дизайн (sequence, hash). При необходимости завершите блокирующую сессию.
Ещё по этой СУБД
- ORA-01578Повреждён блок данных Oracle (file #, block #)
- ORA-01722Недопустимое число
- ORA-02049Тайм-аут: распределённая транзакция ожидает блокировку
- log file syncОжидание: сессия ждёт, пока LGWR сбросит redo на диск при commit
- db file sequential readОжидание: одноблочное физическое чтение, обычно поиск по индексу или таблице
- db file scattered readОжидание: многоблочное физическое чтение, обычно полное сканирование таблицы или index fast full scan
- buffer busy waitsОжидание: конкуренция за буфер, который уже читается или изменяется другой сессией