Реферат: 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

К-во Просмотров: 531
Бесплатно скачать Реферат: Deadlocks