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



              

Механизм взаимоблокировки - часть 2


В результате мы видим, что в каждом из сеансов имеется по одной TX-блокировке в установившемся исключительном режиме. Определить, к какой транзакции относится каждая из этих TX-блокировок, можно с помощью содержимого дополнительных столбцов ID1 и ID2. В них находятся составные части идентификаторов транзакций, декодировать которые можно с помощью следующего запроса:

SYSTEM@XE> SELECT sid, TRUNC(id1/POWER(2,16)) rbs, BITAND(id1, POWER(2,16)-1)+ 0 slot, id2 seq FROM v$lock WHERE sid IN (24, 28) AND type = 'TX';   SID RBS SLOT SEQ --- --- ---- --- 28  4   22   169 24  5   38   163   Выбрано: 2 строки

Расшифровав значения столбцов ID1 и ID2, мы получили номер сегмента отката, слот и  номер изменения транзакции. Эти значения полностью совпадают со значениями из представления v$transaction и все вместе представляют собой идентификатор транзакции в шестнадцатеричном виде:

SYSTEM@XE> SELECT s.sid, t.xidusn, xidslot, xidsqn FROM v$transaction t, v$session s  WHERE t.addr = s.taddr;   SID XIDUSN XIDSLOT XIDSQN --- ------ ------- ------ 24  5      38      163   28  4      22      169     Выбрано: 2 строки

Данный идентификатор нам ещё встретится в дальнейшем, когда мы будем разбирать содержимое трассировочного файла взаимной блокировки, а пока продолжим последовательность начатых нами действий и изменим в первом сеансе содержимое второй строки:

ZH@XE(28)> UPDATE t1 SET c2 = 'Строка2' WHERE c1 = 2;

Ожидание …

Сеанс находиться в ожидании. Оно возникло от того, что первый сеанс пытается установить TX-блокировку в исключительном режиме второй строки, которая уже захвачена TX-блокировкой второго сеанса. Если в это время заглянуть в файл трассировки первого сеанса, то мы увидим там следующие строки:

WAIT #1: nam='enq: TX - row lock contention' ela= 3000022 name|mode=1415053318 usn<<16 | slot=327718 sequence=163 obj#=13766 tim=14923101611

В сеансе постоянно возникает ожидание “конкуренция блокировки строки”. В параметрах этого ожидания  мы видим  уже знакомые нам значения идентификатора транзакции второго сеанса (slot, sequence). Именно эта транзакция установила ранее TX-блокировку второй строки в исключительном режиме и привела к ожиданию. Более детально это можно просмотреть в содержимом представления v$lock:




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