Сначала сервер накладывает эксклюзивную блокировку
намерения IX на таблицу Tbl (TAB 6:2034106287), поскольку в эту таблицу
собирается записывать. Далее накладывается блокировка намерения обновления IU
на первую страницу в таблице (PAG 6:1:17495). Поскольку в этой таблице нет
индекса, то, чтобы найти нужную запись, необходимо прочитать по очереди все
записи, входящие в таблицу, а чтобы прочитать запись, ее надо предварительно
заблокировать, что мы и наблюдаем.
Process
53 acquiring U lock on RID: 6:1:17495:0
|
Обратите внимание, здесь, считывая запись для
проверки, сервер накладывает блокировку обновления. Если запись удовлетворит
условию выборки, можно будет сконвертировать блокировку в эксклюзивную, не
опасаясь возможной взаимоблокировки. Как только сервер убеждается, что запись
не подходит, блокировка снимается. На данном уровне изоляции сервер имеет на
это полное право, добиваясь тем самым более высокой степени параллелизма.
Process
53 releasing lock on RID: 6:1:17495:0
|
Как только находится нужная запись, блокировка на
страницу конвертируется в IX:
Process
53 acquiring IX lock on PAG: 6:1:17495
|
затем блокировка на запись конвертируется в X:
Process
53 acquiring X lock on RID: 6:1:17495:3
|
и производится изменение записи. Блокировка этой
записи, естественно, до конца транзакции не снимается.
Поскольку сервер не знает, что он уже выбрал все
записи, удовлетворяющие условию, то он продолжает перебирать по очереди все, что осталось, накладывая и снимая соответствующую блокировку на каждую запись.
Если после выполнения этой части транзакции посмотреть на наложенные
блокировки, то мы увидим эксклюзивную блокировку записи x = 4 (RID 1:17495:3) и
эксклюзивные блокировки намерения выше по иерархии, на страницу и таблицу:
dbid ObjId
ObjName Type Resource Mode
Status
------
----------- ------- ---- ---------- ----- -------
6 2034106287 Tbl RID 1:17495:3 X GRANT
6 2034106287 Tbl PAG 1:17495 IX
GRANT
6
2034106287 Tbl TAB
IX GRANT
|
Как и следовало ожидать, больше подходящих записей не
нашлось, ничего не обновилось, а значит, других блокировок удерживать не надо.
Теперь переключимся во второе окно и выполним T2, также с выставленным флагом отслеживания порядка наложения блокировок: