Реферат: Deadlocks
SET ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
SELECT * FROM Tbl WHERE X = 2
Все выполнилось успешно, но транзакция все еще считается активной, мы ее не отменили и не зафиксировали. Если в этот момент посмотреть на блокировки, наложенные на таблицу Tbl, можно увидеть примерно следующую картину, с точностью до констант:
spid dbid ObjId ObjName IndId Type Resource Mode Status ------ ------ ---------- ------- ----- ---- --------- ----- ------ 54 6 2034106287 Tbl 0 PAG 1:17495 IS GRANT 54 6 2034106287 Tbl 0 RID 1:17495:1 S GRANT 54 6 2034106287 Tbl 0 TAB IS GRANT |
Иными словами, мы наложили коллективную блокировку (S) на конкретную запись (RID 1:17495:1), и две коллективные блокировки намерения (IS) выше по иерархии, на страницу и таблицу. Откроем новое соединение с той же базой в новом окне QA и попытаемся выполнить эту же транзакцию целиком:
--- установим необходимый уровень изоляции SET ISOLATION LEVEL REPEATABLE READ BEGIN TRAN SELECT * FROM Tbl WHERE X = 2 UPDATE Tbl SET Y = 3 WHERE X = 2 COMMIT TRAN |
Блокировок, естественно, добавилось:
spid dbid ObjId ObjName IndId Type Resource Mode Status ------ ------ ----------- ------- ------ ---- ---------- ----- ------- 54 6 2034106287 Tbl 0 PAG 1:17495 IS GRANT 54 6 2034106287 Tbl 0 RID 1:17495:1 S GRANT 54 6 2034106287 Tbl 0 TAB IS GRANT 61 6 2034106287 Tbl 0 PAG 1:17495 IX GRANT 61 6 2034106287 Tbl 0 RID 1:17495:1 X CNVT 61 6 2034106287 Tbl 0 TAB IX GRANT |
Те, что (в моем случае) от spid 54 – это наложенные ранее, от первой транзакции, а те, у которых spid 61 - от второй. С блокировками намерения все то же самое, они запрошены и успешно получены. А вот с эксклюзивными ситуация такая: сначала, выполняя SELECT, мы получили разделяемую блокировку на ту же запись (RID 1:17495:1), что и первая транзакция. Затем нам понадобилось туда же записать, а для этого надо сконвертировать коллективную блокировку S до X. Однако сделать это не получается, так как мешает S-блокировка на ту же запись от первой транзакции. Что мы и видим в третьей снизу строчке, статус эксклюзивной блокировки (X) CNVT – конвертирование. То есть SELECT выполнился, но до UPDATE дело не дошло, T2 ждет, пока T1 освободит запись X=2, чтобы наложить эксклюзивную блокировку.
Переключимся обратно в первое окно и попытаемся завершить T1:
UPDATE Tbl SET Y=3 WHERE X=2 COMMIT TRAN |