Блокируют ли транзакции в SQL Server все таблицы внутри оператора по умолчанию? - PullRequest
3 голосов
/ 01 ноября 2019

Предположим, у меня есть оператор T-SQL, например:

BEGIN TRAN

    UPDATE dbo.TableA 
    SET
    ...
    ...

    DELETE FROM dbo.TableB

COMMIT TRAN

Предположим, что обновление таблицы TableA займет некоторое время.

По умолчанию SQL Server заблокирует TableBпока транзакция не будет завершена? Значит ли это, что вы не можете читать или писать, пока идет обновление?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Короткий ответ: НЕТ и НЕТ .

Длинный ответ: На самом деле, это большой вопрос, поскольку он углубляется в концепции транзакций и как работает механизм, но я думаю, чтоПолный ответ может занимать большую часть главы о хорошей книге и выходит за рамки этого сайта.

Первый , имейте в виду, что двигатель может работать в нескольких режимах изоляции:снимок, чтение зафиксировано и т. д. Я могу порекомендовать хорошие исследования по этой теме (это может занять несколько дней).

Второй , двигатель имеет уровень детализации и попытается использовать«самый маленький», но может увеличивать его по требованию, в зависимости от многих факторов, например: «понадобится ли этой операции разделение страницы?»

Третий , BEGIN, COMMIT, ROLLBACK работают больше как "семафор", помечая, как изменения поэтапно переходят от "памяти" к "диску". Это намного сложнее, чем это, и поэтому я использую кавычки.

При этом «транзакция по умолчанию» будет использовать гранулярность строки в режиме изоляции с фиксацией чтения. Ничто не говорит о том, как блокировки будут выдаваться так или иначе. Это зависит от таких вещей, как внешние ключи, триггеры, размер таблицы и т. Д.

TLDR: это зависит от множества мелких деталей, характерных для вашего сценария. Лучший способ выяснить это путем тестирования.

0 голосов
/ 01 ноября 2019

Следуя комментариям @Jeroen Mostert, @marc_s и @Cato по данному вопросу, ваши блокировки в TableA и TableB здесь, вероятно, перерастут в эксклюзивные блокировки таблиц, так как отсутствует предложение "where". Если это так, другие операции чтения и записи из разных соединений могут быть затронуты в зависимости от уровня изоляции транзакции до конца этой транзакции.

Кроме того, блокировки создаются по требованию;это означает, что запрос сначала устанавливает блокировку таблицы A, а после выполнения операции обновления устанавливает другую блокировку таблицы B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...