Базы данных Oracle - статьи



             

Наложение значений первичного или уникального ключа при вставке


Для начала образуем два сеанса. Очистим таблицу t1 и для наглядности исследования процесса взаимного блокирования включим трассировку в первом сеансе. Далее в  этом же сеансе будем  последовательно вставлять в таблицу t1 две строки с ключами 1 и 2, а во втором проделаем те же действия, но только  в обратном направлении.

Первый сеанс:

ZH@XE(28)> TRUNCATE TABLE t1;     Таблица очищена   ZH@XE(28)> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';   Session altered

ZH@XE(28)> INSERT INTO t1 (c1, c2) VALUES(1, ‘Строка1’);   Вставлено: 1 строка

Второй сеанс:

ZH@XE(38)> INSERT INTO t1 (c1, c2) VALUES(2, ‘Строка2’);   Вставлено: 1 строка

В результате выполненных выше действий в каждом из сеансов нами были установлены по одной транзакционной блокировке в исключительном режиме (LMODE=6):

SYSTEM@XE> SELECT * FROM v$lock WHERE sid IN (28, 38) AND type = 'TX';   ADDR     KADDR    SID TYPE ID1    ID2 LMODE REQUEST CTIME BLOCK -------- -------- --- ---- ------ --- ----- ------- ----- ----- 296EF030 296EF14C 28  TX   524323 168 6     0       84    0     296F6648 296F6764 38  TX   65564  175 6     0       72    0       Выбрано: 2 строки

Теперь в первом сеансе попытаемся  вставить  строку с ключом 2. В связи с тем, что таблица t1 имеет ограничение первичного ключа, и строка с таким же значением данного ключа уже вставлена в незавершённой транзакции второго сеанса, выполнение этого оператора должно привести к ожиданию:

ZH@XE(28)> INSERT INTO t1 (c1, c2) VALUES(2, 'Строка2');

Ожидание …

Если в это время заглянуть в трассировочный файл первого сеанса, можно увидеть, что в сеансе постоянно возникает ожидание  “конкуренция блокировки строки”:

WAIT #2: nam='enq: TX - row lock contention' ela= 3001240 name|mode=1415053316 usn<<16 | slot=65564 sequence=175 obj#=13766 tim=3276462301

Но какой строки? Вставленные в таблицу строки не видны сеансам, так как транзакции не зафиксированы. Следовательно, они не могут являться причиной ожидания. Для прояснения ситуации заглянем в системное представление v$lock:




Содержание  Назад  Вперед