Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
Добрый день.

Подскажите в какой последовательности будут налагаться блокировки в таком случае.
Есть таблица с кластерным индексом и несколькими некластерными. Происходит вставка записи в таблицу. Менеджер транзакций открывает транзакцию и передаёт управления менеджеру блокировок. Как дальше развиваются события? По идее, инструкция не стартует до тех пор, пока не наложены все необходимые для её выполнения блокировки. Собственно, вопрос: блокировки некластерных индексов являются необходимыми на этом этапе? Или менеджеру блокировок достаточно получить Х на диапазон кластерного чтобы стартонуть?
12 янв 12, 16:06    [11893434]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
Интересуюсь потому, что возникают длительные блокировки, если 1 процесс пытается вставить данные в таблицу после того, как другой считал часть данных при помощи покрывающего некласт. индекса.
12 янв 12, 17:08    [11894001]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
если транзакция закрыта, то после того, как процесс считал данные, блокировать он уже ничего не может.
Смотрите sp_lock и какие блокировки накладываются при вашем чтении таблицы.

Блокировки некластерного индекса - такого нет вообще.
Есть блокировки уровня записи/ключа (RID/KEY). RID - для таблиц без кластерного индекса, KEY для таблиц с кластерным индексом.
12 янв 12, 17:21    [11894130]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
--__Александр__--
если транзакция закрыта, то после того, как процесс считал данные, блокировать он уже ничего не может.
Смотрите sp_lock и какие блокировки накладываются при вашем чтении таблицы.

Блокировки некластерного индекса - такого нет вообще.
Есть блокировки уровня записи/ключа (RID/KEY). RID - для таблиц без кластерного индекса, KEY для таблиц с кластерным индексом.

Э-э-э... Может я неправильно выразился. Если оптимизатор знает, что все данные может получить из некластерного индекса, но таблица имеет класт. индекс - как тогда будет называться блокировка?
12 янв 12, 17:57    [11894536]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
KEY
Так как если на таблице есть класетрный индекс, то последний листовой уровень не кластерного индекса содержит ключ кластерного индекса.
12 янв 12, 18:02    [11894596]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
--__Александр__--
KEY
Так как если на таблице есть класетрный индекс, то последний листовой уровень не кластерного индекса содержит ключ кластерного индекса.

Что-то я запутался ) Если кластерный ключ построен по полю ID INT IDENTITY(1,1) NOT NULL, а некластерный, скажем, по FirstName INCLUDE (LastName) и запрос типа
SELECT  LastName
FROM    Table
WHERE  FirstName = 'A'


Lookup'ов здесь не будет, т.е. обращаться к класт. индексу по сути не надо. И всё равно на класт. будет наложена разделяемая блокировка?
12 янв 12, 18:47    [11894931]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
Сделал так
CREATE TABLE dbo.t 
( 
  ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
, FirstName varchar(50) DEFAULT(CONVERT(varchar(max), NEWID()))
, LastName varchar(50) DEFAULT(CONVERT(varchar(max), NEWID()))
)
GO

CREATE INDEX [IX] ON dbo.t (FirstName ASC)
INCLUDE (LastName)
GO

DECLARE @i int = 0


WHILE @i < = 100000
BEGIN
INSERT INTO dbo.t
DEFAULT VALUES

SET @i = @i + 1
END
GO

BEGIN TRANSACTION
SELECT	LastName
FROM	        dbo.t WITH (HOLDLOCK)
WHERE       FirstName = 'BC49206C-B9C4-4543-B14D-CBECE6A4E473'


Выполняю в другой сессии вот это
SELECT dm_tran_locks.request_session_id,
       dm_tran_locks.resource_database_id,
       DB_NAME(dm_tran_locks.resource_database_id) AS dbname,
       CASE
           WHEN resource_type = 'object'
               THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id)
           ELSE OBJECT_NAME(partitions.OBJECT_ID)
       END AS ObjectName,
       partitions.index_id,
       indexes.name AS index_name,
       dm_tran_locks.resource_type,
       dm_tran_locks.resource_description,
       dm_tran_locks.resource_associated_entity_id,
       dm_tran_locks.request_mode,
       dm_tran_locks.request_status
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id
JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id
WHERE resource_associated_entity_id > 0
  AND resource_database_id = DB_ID()
ORDER BY request_session_id, resource_associated_entity_id 


И получаю

request_session_id resource_database_id ObjectName index_id index_name resource_type request_mode request_status
------------------ -------------------- ---------- ----------- ---------- ------------- ------------ --------------
67 32 t 2 IX KEY RangeS-S GRANT
67 32 t 2 IX PAGE IS GRANT
67 32 t 2 IX KEY RangeS-S GRANT


Кластерный индекс здесь не фигурирует
12 янв 12, 19:25    [11895138]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
--__Александр__--
если транзакция закрыта, то после того, как процесс считал данные, блокировать он уже ничего не может.
Смотрите sp_lock и какие блокировки накладываются при вашем чтении таблицы.

Блокировки некластерного индекса - такого нет вообще.
Есть блокировки уровня записи/ключа (RID/KEY). RID - для таблиц без кластерного индекса, KEY для таблиц с кластерным индексом.


А что означает "если транзакция закрыта"?
12 янв 12, 20:25    [11895438]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
JustCurious
А что означает "если транзакция закрыта"?

Это та транзакция в которой делали вставку, словила последний COMMIT или ROLLBACK. После того как транзакция откатилась или зафиксировалась, никаких блокировок от неё быть не может.

По индексам: как уже сказали тебе в листьях не_кластерного индекса хранятся значения полей кластерного индекса; эти значения используются для Key Lookup'а. Если значения кластерного индекса должны измениться (в том числе удалиться/добавиться) то соответствующие им записи некластерного индекса будут заблокированы, чтоб случайно не вышло что в кластерном индексе удалили запись, а на её ключ ссылаются записи не_кластерных индексов.
Если один процесс добавил запись, то на ней и на всех записях не_кластерных индексов (которые вместе с записью в кластерный добавлены были), на неё ссылающихся, будет X блокировка висеть до закрытия транзакции вставившей её.
Как-то так...
12 янв 12, 22:28    [11895957]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
JustCurious
Member

Откуда: UA
Сообщений: 94
ZOOKABAKODER
JustCurious
А что означает "если транзакция закрыта"?

Это та транзакция в которой делали вставку, словила последний COMMIT или ROLLBACK. После того как транзакция откатилась или зафиксировалась, никаких блокировок от неё быть не может.

По индексам: как уже сказали тебе в листьях не_кластерного индекса хранятся значения полей кластерного индекса; эти значения используются для Key Lookup'а. Если значения кластерного индекса должны измениться (в том числе удалиться/добавиться) то соответствующие им записи некластерного индекса будут заблокированы, чтоб случайно не вышло что в кластерном индексе удалили запись, а на её ключ ссылаются записи не_кластерных индексов.
Если один процесс добавил запись, то на ней и на всех записях не_кластерных индексов (которые вместе с записью в кластерный добавлены были), на неё ссылающихся, будет X блокировка висеть до закрытия транзакции вставившей её.
Как-то так...

Cпасибо за разъяснения. Вопрос как раз заключался в том, будут ли все блокировки на некластерные индексы наложены до начала вставки записи.
12 янв 12, 23:06    [11896125]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность наложения блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
JustCurious, настройте в профайлере мониторинг нужных событий группы Locks и увидите процесс наложения/снятия блокировок вживую.
13 янв 12, 00:11    [11896300]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить