Изключителност на X
ключалки срещу U
ключалки
В матрицата за съвместимост на заключване по-долу може да се види, че X
заключването е съвместимо само със стабилността на схемата и типовете заключване Insert 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
locks, той ще пропусне тази стъпка, ако няма риск от четене на незаети данни без тях. Това означава, че няма гаранция, че някога ще възникне конфликт при заключване.
Ако обаче първоначалният избор е with (paglock,XLOCK)
тогава това ще спрете транзакцията за четене като X
заключването на страницата ще блокира IS
заключване на страницата, което винаги ще е необходимо на читателя. Това разбира се ще окаже влияние върху едновременността.
Други предупреждения
Дори ако заключите реда/страницата, това не означава, че блокирате всички достъпи до този ред в таблицата. Заключването на ред в клъстерирания индекс няма да попречи на заявките да четат данни от съответния ред в покриващ неклъстериран индекс.