Предположим, у меня есть следующая транзакция:
BEGIN TRAN
DECLARE @id UNIQUEIDENTIFIER = NEWID()
UPDATE A
WHERE A.id = @id
Какая блокировка будет удерживаться на таблице A до тех пор, пока я не зафиксирую транзакцию? Это X-lock, S-lock или какой-то другой замок?
Если id
является первичным ключом, я ожидаю, что эксклюзивная блокировка строки (X) будет удерживаться до тех пор, пока транзакция не будет зафиксирована.
Я предполагаю, что никаких блокировок нет, потому что ваш оператор не сможет скомпилироваться.
@AlwaysLearning Я попробовал - в sys.dm_tran_locks было добавлено несколько разных блокировок, поэтому я не знаю, какая из них соответствует моей таблице
Это зависит от структуры таблицы... Если столбец идентификатора является ПЕРВИЧНЫМ КЛЮЧОМ, а у первичного ключа нет другого столбца, блокировка будет блокировкой «строки»:
если ПК кластеризован, с помощью «логической» блокировки строки
Если ПК некластеризован, с помощью «физической» блокировки строки.
В UPDATE тип блокировки всегда является блокировкой UPDATE, начиная с общего и монопольного, когда строка найдена. Первая общая часть этой блокировки запрещает добавлять новые общие блокировки... чтобы общую блокировку можно было преобразовать в эксклюзивную, когда все остальные процессы завершатся....
А продолжительность блокировки — это только время обновления плюс освобождение общих блокировок параллелизма при пессимистической блокировке...
Блокировка U совместима с S, но несовместима с U. Цель состоит в том, чтобы не допустить, чтобы два UPDATES находили одну и ту же строку для обновления, а затем оба пытались получить блокировку X для найденной строки. Learn.microsoft.com/en-us/sql/relational-databases/…
Почему бы вам не попробовать и посмотреть? Что отображается в
sys.dm_tran_locks
, пока транзакция выполняется?