Когда освобождаются общие блокировки чтения? - PullRequest
10 голосов
/ 03 июня 2009

Когда в электронной документации по SQL Server написано, что «Общие (S) блокировки ресурса освобождаются , как только операция чтения завершается , если только уровень изоляции транзакции не установлен на повторяемое чтение или выше, или не используется подсказка блокировки сохранить общие (S) блокировки на время транзакции. "

Предполагая, что речь идет о блокировке на уровне строк без явной транзакции на уровне изоляции по умолчанию (Read Committed), что означает « операция чтения »?

  • Чтение одной строки данных?
  • Чтение одной 8k IO Page?
  • или до тех пор, пока не завершится выполнение полного оператора Select, в котором была создана блокировка, независимо от количества других строк участие?

ПРИМЕЧАНИЕ. Причина, по которой мне нужно это знать, заключается в том, что у нас есть несколько вторых операторов выбора только для чтения, сгенерированных веб-службой уровня данных, которая создает общие блокировки чтения на уровне страницы, создавая взаимоблокировку из-за конфликта с уровнем строки эксклюзивное обновление блокируется от процесса репликации, который поддерживает обновление сервера. Оператор выбора довольно большой, со множеством подвыборов, и один администратор БД предлагает переписать его, чтобы разбить его на несколько более мелких операторов (более короткие ходовые части), «чтобы сократить продолжительность удержания блокировок». Поскольку это предполагает, что общие блокировки чтения удерживаются до завершения полного оператора выбора, если это неправильно (если блокировки снимаются, когда строка или страница читаются), тогда этот подход не будет иметь никакого эффекта ...

Ответы [ 3 ]

4 голосов
/ 03 июня 2009

На самом деле довольно интересно наблюдать, вы можете запустить профилировщик и отследить получение / снятие блокировки некоторых простых запросов. Я сделал это некоторое время назад, это было что-то вроде: приобрести страницу 1 получить строку 1 получить строку 2 выпуск строки 1 получить ряд 3 выпуск строки 2 приобрести страницу 2 страница релиза 1 ...

Возможно, я не на 100% прав, но это был в основном подход. Таким образом, блокировка снимается после прочтения строки, или, может быть, правильнее, после получения блокировки следующей строки. Я подозреваю, что это может быть связано с сохранением согласованного состояния для обхода.

1 голос
/ 13 января 2012

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

SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = <SPID>

Итак, я думаю, что происходит:

  1. приобретение: общая блокировка базы данных, общая блокировка таблицы, общая блокировка страницы
  2. страница прочитана ... блокировка одновременного снятия на странице И блокировка на следующей странице

Результатом двух является то, что иногда в запросе sys.dm_tran_lock. Я вижу две блокировки PAGE и иногда один и несколько раз три ... зависит от того, что происходит быстрее при одновременных действиях.

0 голосов
/ 07 января 2019

Что касается конкретной документации, я нашел это:

Если для READ_COMMITTED_SNAPSHOT установлено значение OFF (по умолчанию в SQL Server), компонент Database Engine использует общие блокировки для предотвращения других транзакций от изменения строк, пока текущая транзакция выполняет чтение операция. Общие блокировки также блокируют оператор от чтения строк изменен другими транзакциями, пока другая транзакция не станет завершено. Тип общей блокировки определяет, когда она будет снята. Блокировки строк снимаются до обработки следующей строки. Блокировка страницы освобождаются, когда читается следующая страница, и снимаются блокировки таблиц когда утверждение заканчивается.

Источник: https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-2017

...