Эксклюзивность X
блокировок против U
блокировок
В матрице совместимости блокировок ниже видно, что блокировка X
совместима только со стабильностью схемы иВставьте Range-Null типы блокировки.U
совместим со следующими дополнительными типами общей блокировки S
/ IS
/ RS-S
/ RI-S
/ RX-S
матрица совместимости блокировки http://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif
Гранулярностьиз X
замков
На всех уровнях они снимаются нормально.Приведенный ниже сценарий и трассировка профилировщика демонстрирует их успешное удаление на уровне строк.
CREATE TABLE test_table (id int identity(1,1) primary key, col char(40))
INSERT INTO test_table
SELECT NEWID() FROM sys.objects
select * from test_table with (rowlock,XLOCK) where id=10
Но строки все еще можно прочитать!
Оказывается,что при read committed
уровне изоляции SQL Server не всегда будет снимать S
блокировки, пропустит этот шаг, если не будет риска чтения незафиксированных данных без них .Это означает, что нет никакой гарантии того, что когда-либо возникнет конфликт блокировки.
Однако, если начальный выбор равен with (paglock,XLOCK)
, тогда этот остановит транзакцию чтения, так как блокировка X
на странице заблокирует блокировку страницы IS
, которая всегда будет необходимачитателем.Это, конечно, повлияет на параллелизм.
Другие предупреждения
Даже если вы заблокируете строку / страницу, это не означает, что вы заблокируете все обращения к этой строке в таблице.Блокировка строки в кластеризованном индексе не помешает запросам на чтение данных из соответствующей строки в покрывающем некластеризованном индексе.