Ответ 1
Прежде всего, оператор select
никогда не блокирует что-либо в Oracle, просто использует последнюю доступную согласованную версию данных. Это не случай для select ... for update
, который блокирует данные типа update
с Oracle 9i, но в вопросе из вопроса нет предложения for update
.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 210 72 SX SSX 208 24 SX SSX
Сессия № 72 содержит блокировку на уровне таблицы (TM) с типом "Row Exclusive" (SX) и хочет приобрести блокировку "Share Row Exclusive" (SSX) в той же таблице. Этот сеанс заблокирован сеансом № 24, который уже содержит блокировку на уровне таблицы одного и того же типа (SX) и ждет, пока блокировка SSX будет доступна.
Resource Name process session holds waits process session holds waits
TM-000151a2-00000000 208 24 SX SSX 210 72 SX SSX
Эта (вторая строка) демонстрирует точно такую же ситуацию, но в противоположном направлении: сеанс № 24 ожидает, что блокировка SSX станет доступной, но заблокирована сеансом № 72, который уже удерживает блокировку SX в одной таблице.
Итак, сеансы # 24 и сеанс № 72 блокируют друг друга: происходит взаимоблокировка.
Оба типа блокировки (SX и SSX) являются блокировками на уровне таблицы.
Чтобы понять ситуацию, я рекомендую прочитать эту статью от Franck Pachot.
Ниже приведена цитата из этой статьи, которая имеет прямое отношение к вашей ситуации (обратите внимание, что аббревиатуры SSX и SRX эквивалентны):
Ссылочная целостность также получает блокировки TM. Например, общий проблема с неиндексированными внешними ключами приводит к блокировке S на дочернем столе, когда вы производите удаление или обновление ключа в родительской таблице. Это поскольку без индекса Oracle не имеет единого ресурса нижнего уровня для блокировки, чтобы предотвратить одновременную вставку, которая может нарушить ссылочная целостность.
Когда столбцы внешнего ключа являются ведущими столбцы в регулярном индексе, то первая запись индекса с родительским значение может использоваться как один ресурс и заблокирован с помощью TX блокировки.
И что, если ссылочная целостность имеет на каскаде удаления? В дополнение к режиму S, есть намерение обновить строки в дочерний стол, как и в режиме Row X (RX). Это где доля строк (SRX): S + RX = SRX.
Таким образом, наиболее вероятным вариантом является то, что сеанС# 72 и сеанс 24 одновременно удаляют несколько строк в таблице EMPLOYEE
, а ограничение on delete cascade
для EMPSAL_EMP_ID
в связи с отсутствием индекса на EMPLOYEE_SALARY
таблица, в которой столбец EMPSAL_EMP_ID
указан первым.