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



              

Механизм взаимоблокировки


Вначале создадим тестового пользователя zh и выдадим ему все необходимые привилегии:

Подключение к: Oracle Database 10g Express Edition Release 10.2.0.1.0 – Production

SYSTEM@XE> CREATE USER zh IDENTIFIED BY test DEFAULT TABLESPACE users;   Пользователь создан

SYSTEM@XE> GRANT connect, resource, alter session TO zh;   Grant succeeded

Далее создадим простую таблицу  и вставим в неё две строки:

ZH@XE> CREATE TABLE t1 (c1 NUMBER PRIMARY KEY, c2 VARCHAR2(50));   Таблица создана

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

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

ZH@XE> COMMIT;   Commit complete

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

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

ZH@XE(28)> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';   Session altered

ZH@XE(28)> UPDATE t1 SET c2 = 'Строка1' WHERE c1 = 1;   Изменено: 1 строка

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

ZH@XE(24)> UPDATE t1 SET c2 = 'Строка2' WHERE c1 = 2;   Изменено: 1 строка

В результате выполненных нами действий в существующих сеансах были открыты две транзакции. В первом сеансе была выставлена блокировка транзакции (TX) на первую строку в исключительном режиме. Такая же блокировка выставлена и во втором сеансе, но на вторую строку.  Убедиться в этом мы можем, сделав небольшой запрос к системному представлению v$lock:

SYSTEM@XE> SELECT * FROM v$lock WHERE sid IN (24, 28) AND type = 'TX';   ADDR     KADDR    SID TYPE ID1    ID2 LMODE REQUEST CTIME BLOCK -------- -------- --- ---- ------ --- ----- ------- ----- ----- 296EE5D8 296EE6F4 28  TX   262166 169 6     0       1110  0    296FA680 296FA79C 24  TX   327718 163 6     0       879   0   

Рассмотрим более подробно содержимое этого запроса. Столбец SID здесь содержит идентификаторы первого и второго сеансов (28 и 24). Содержимое столбца TYPE указывает на тип блокировки, в нашем случае блокировки транзакции (TX). Столбец LMODE хранит значение 6, что соответствует установившемуся исключительному режиму блокировки.




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