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

Откуда:
Сообщений: 48
Всем Здравствуйте!

Убедительная просьба, если есть желание помочь, то лучше отвечать, а не оставлять ссылки :).

Вводные данные. MS SQL Server 2008R2. Создал таблицу dbo.Table_2 в базе Base: Pole1, Pole2 (тип полей nchar 10, не NULL). Создал не уникальный составной кластеризованный индекс: Pole1, Pole2.

Открыл два сеанса и выполняю следующий код:

begin tran
go

INSERT INTO [Base].[dbo].[Table_2]
           ([Pole1]
           ,[Pole2])
     VALUES
           ('znach'
           ,'znach')
GO

commit tran 
go


В первом сеансе ставлю точку останова на commit tran.

Выполняю запрос sys.dm_tran_locks. В полученном результате вижу, что действуют следующие блокировки (назовем их текущие locks): S на Database (на базу данный); IX (блокировка намерений на запись) на PAGE (на страницу); IX на OBJECT (на саму таблицу); X на KEY (на запись в кластерном индексе).

В трассировке профайлером, также вижу, установку данных блокировок, но с единственной разницей: перед установкой X на KEY была произведена RangeI-N на KEY (блокировка диапазона ключей индекса). Первый вопрос! Блокировка RangeI-N была мгновенно преобразована в X на KEY и поэтому её нет в текущих locks? Блокировка RangeI-N всегда мгновенно при инсертах преобразуется в X?

После этого выполняю тот же код во-втором сеансе. Код выполняется успешно.

Вторая группа вопросов. В текущих locks стоят две блокировки намерений на запись одна на страницу, вторая на таблицу. Много где пишут, что блокировка намерений используется для создания иерархии блокировок, устанавливаются на верхних уровнях и обозначают намерение поместить блокировку на более низком уровне. Т.е. у меня, также получилось всё, как по книжке. Верно ли я понимаю, что термин совместимости блокировок намерения с блокировками не относящимися к блокировкам намерения (S,U,X, блокировки диапазонов) не имеет смысла, также, как и блокировки намерений совместимы между собой? Потому, как в моем случае, что второй сеанс также наложил те же блокировки, включая X блокировку и никакого ожидания не произошло. Второй сеанс не ждал первый. Я понимаю почему X блокировка второго сеанса не встала в ожидание за X блокировкой первого сеанса: ключи разные.

Третья группа вопросов. Сущность блокировки диапазона я видел себе в следующем: удерживается на уровне изоляции SERIALIZABLE до конца транзакции (практика показывает, что нет; я ошибаюсь); когда идет обращение к диспетчеру блокировок установлена ли какая-нибудь блокировка на запрашиваемый ресурс, то диспетчер, если есть блокировки на диапазон, вычисляет на основании данных блокировок диапазон по минимальным значениям (опять, таки, вопрос чего?: вставляемых значений или KEY, понятно что ресурса, но что в таком случае является ресурс?) и, если запрашиваемый ресурс попадает в данный диапазон, (т.е. производятся операции сравнения =>,<=) - происходит ожидание на блокировке. Если блокировка не относится к диапазонам, т.е., например, блокировка X или S, то диспетчер блокировок не вычисляет диапазон, а просто использует единственное сравнение на равенство (=). Поправьте, пожалуйста мое видение как в действительности все происходит?

Заранее, благодарю!
21 фев 16, 23:32    [18850124]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
alexey777
Блокировка RangeI-N была мгновенно преобразована в X на KEY и поэтому её нет в текущих locks?
Да.
alexey777
Блокировка RangeI-N всегда мгновенно при инсертах преобразуется в X?
Да.
После получения, RangeI-N конвертируется в X, т.к. свою функцию выполнила - если эта блокировка получена, значит нет других несовместимых range-блокировок, т.е. нет пересечения с защищенными от вставок диапазонами ключа.
alexey777
Верно ли я понимаю, что термин совместимости блокировок намерения с блокировками не относящимися к блокировкам намерения (S,U,X, блокировки диапазонов) не имеет смысла, также, как и блокировки намерений совместимы между собой?
Не верно.
Блокировки намерения служат для быстрого поиска несовместимых блокировок с запрашиваемой.
Например, наличие IX на уровне таблицы означает, что обязательно существует X на страницу или строку.
Поэтому, если другой сеанс запросит S на эту же таблицу, не нужно искать несовместимые блокировки страниц или строк, достаточно найти несовместимую I* на уровне таблицы.
alexey777
Поправьте, пожалуйста мое видение как в действительности все происходит?
В действительности ничего не вычисляется.
Блокировка диапазона - это всегда блокировка ключа, т.е. одной строки.
Если вы пишите на TIL serializable where SomeKey between A and B, - это не означает, что будет наложена одна блокировка на диапазон [A, B], это означает, что будет наложена range-блокировка на каждый ключ индекса из диапазона [A, B]. А Range означает диапазон (предыдущий ключ, ключ].
Поэтому проверка попадания ключа в заблокированный диапазон сводится к нахождению следующего ключа и проверки наличия на нем несовместимой range-блокировки.

Рекомендуется к прочтению - SQL Server Concurrency: Locking, Blocking and Row Versioning
22 фев 16, 01:02    [18850268]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
alexey777
Member

Откуда:
Сообщений: 48
invm, Спасибо!
автор
"Не верно.
Блокировки намерения служат для быстрого поиска несовместимых блокировок с запрашиваемой.
Например, наличие IX на уровне таблицы означает, что обязательно существует X на страницу или строку.
Поэтому, если другой сеанс запросит S на эту же таблицу, не нужно искать несовместимые блокировки страниц или строк, достаточно найти несовместимую I* на уровне таблицы."


Не совсем, понимаю. В моем же случае, тогда блокировки намерений в первом сеансе IX на PAGE и IX на OBJECT несовместимы с аналогичными блокировками намерений второго сеанса, т.к. накладываются на одинаковые ресурсы, а вот ожидания не происходит. И X блокировка накладываемая во-втором сеансе тоже ведь несовместима с данными блокировками и ожидания не происходит. Или блокировки на ожидания несовместимы только с S блокировкой?

С Range блокировкой, вроде, как понятно. Не ясен только один момент. Если она такая быстрая и тут же мгновенно эволюционирует :) в другую блокировку, то как тогда она производит защиту этого самого диапазона, она же просто не должна успевать этого делать :)?
22 фев 16, 01:58    [18850342]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
aleks2
Guest
Своеобразный у тредстартера способ изучения MS SQL.
Какая разница, как там накладываются блокировки?
22 фев 16, 05:45    [18850389]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
alexey777
Member

Откуда:
Сообщений: 48
invm,

invm
Если вы пишите на TIL serializable where SomeKey between A and B, - это не означает, что будет наложена одна блокировка на диапазон [A, B], это означает, что будет наложена range-блокировка на каждый ключ индекса из диапазона [A, B]. А Range означает диапазон (предыдущий ключ, ключ].
Поэтому проверка попадания ключа в заблокированный диапазон сводится к нахождению следующего ключа и проверки наличия на нем несовместимой range-блокировки.


А если заменим диапазон на [A, D] и в таблице есть значения A,D. А мы пытаемся вставить значение C. В locks будем наблюдать блокировки: RangeI-N на KEY на A; RangeI-N на KEY на D. И всё, больше никаких блокировок диапазонов, Верно? Идём дальше. При попытке вставить значение C у нас не должно возникнуть никаких проблем, т.к. мы проверяем на равенство (=), а не на <= or >=. RangeI-N на KEY на C нет. Но вот если минимальные значения ресурсов (опять возникает вопрос, что такое ресурс) выстроены по возрастанию, тогда диспетчер блокировок может в цикле проверить вхождение, использую операцию <= or >=. Но т.к. таких строк может быть очень много (выстроенных по порядку), то тратить на это время цикла очень не эффективно. Поэтому я и предположил, что вычисляется какой-то один диапазон из всех строк. Например, у нас есть диапазоны: от A до B (две строки); от R до T(три строки); и от F до J (4 строки). В результате вычисления получим диапазон от A до T, с которым и произведем сравнение. Я верно мыслю?

aleks2
Какая разница, как там накладываются блокировки?


Мне интересно. Может быть Вы расскажите?
22 фев 16, 12:09    [18850736]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
alexey777,
Key range locks работают уже на уровне repeatable read, там они применяются для осуществления стабилизации наборов данных читающих транзакции.

Также они могут применяться при наличии констрейнтов.
22 фев 16, 13:31    [18850935]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
MasterZiv
Key range locks работают уже на уровне repeatable read, там они применяются для осуществления стабилизации наборов данных читающих транзакции.

Также они могут применяться при наличии констрейнтов
https://technet.microsoft.com/en-us/library/ms191272(v=sql.105).aspx
Key-range locks protect a range of rows implicitly included in a record set being read by a Transact-SQL statement while using the serializable transaction isolation level. The serializable isolation level requires that any query executed during a transaction must obtain the same set of rows every time it is executed during the transaction. A key range lock protects this requirement by preventing other transactions from inserting new rows whose keys would fall in the range of keys read by the serializable transaction.
22 фев 16, 14:06    [18851000]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
alexey777
В моем же случае, тогда блокировки намерений в первом сеансе IX на PAGE и IX на OBJECT несовместимы с аналогичными блокировками намерений второго сеанса, т.к. накладываются на одинаковые ресурсы, а вот ожидания не происходит. И X блокировка накладываемая во-втором сеансе тоже ведь несовместима с данными блокировками и ожидания не происходит.
У вас каша в голове. Вы смешали в одну кучу гранулярность блокировок и их совместимость.
1. Блокировки намерения совместимы друг с другом и не совместимы с большинством обычных - Lock Compatibility (Database Engine)
2. Наличие конфликта блокировок проверяется только для ресурса, на который эти блокировки накладываются.
alexey777
А если заменим диапазон на [A, D] и в таблице есть значения A,D. А мы пытаемся вставить значение C. В locks будем наблюдать блокировки: RangeI-N на KEY на A; RangeI-N на KEY на D. И всё, больше никаких блокировок диапазонов, Верно? Идём дальше. При попытке вставить значение C у нас не должно возникнуть никаких проблем, т.к. мы проверяем на равенство (=), а не на <= or >=. RangeI-N на KEY на C нет.
Откуда такие фантазии? Будет попытка получить RangeI-N на C. При успешном получении она будет конвертирована в X.
alexey777
Если она такая быстрая и тут же мгновенно эволюционирует :) в другую блокировку, то как тогда она производит защиту этого самого диапазона, она же просто не должна успевать этого делать :)?
"Она" - это RangeI-N?
Так вот, RangeI-N ничего не защищает. Защищают другие блокировки Range*. С помощью RangeI-N проверяется допустимость вставки нового значения в диапазон ключей.

Если взять ваш пример: Допустим, некая сессия имеет RangeS-S на A и RangeS-S на D.
Другая сессия при вставке ключа C попытается получить RangeI-N на C. Для этого определяется следующее значение ключа - это D. На D уже есть RangeS-S, которая блокирует диапазон (A, D] и не совместима с RangeI-N.
Поэтому сессия, вставляющая ключ C будет ждать, пока вторая не снимет RangeS-S с D.

Таким образом, успешное получение RangeI-N означает отсутствие заблокированых диапазонов, в которые попадает вставляемое значение ключа.
22 фев 16, 14:53    [18851116]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
alexey777
Member

Откуда:
Сообщений: 48
invm, Спасибо!

invm
Вы смешали в одну кучу гранулярность блокировок и их совместимость.

Я правильно понимаю, что конфликт блокировок будет происходить исключительно на одинаковом уровне гранулярности у ресурсов? Т.е. X1 блокировка будет конфликтовать с X2 блокировкой только в случае, если они равны по гранулярности (X1 KEY и X2 KEY или X1 RID и X2 RID ...) и, соответственно по значениям гранул, также равны.

В матрице совместимости блокировок я вижу, что IX конфликтует с X, но, т.к. IX, в моем случае, была наложена на таблицу и на страницу, а X на ключ индекса - и не важно, что ключ индекса принадлежит этой же таблице и странице - конфликта не будет, т.к. гранулярности ресурсов не совпадают. Верно я понял?
27 фев 16, 20:55    [18872336]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
alexey777
Верно я понял?
Да.
27 фев 16, 21:16    [18872393]     Ответить | Цитировать Сообщить модератору
 Re: Понимание устройства сущности механизма блокировок  [new]
alexey777
Member

Откуда:
Сообщений: 48
Спасибо!!!!
27 фев 16, 22:36    [18872651]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить