Я хотел бы понять, будут ли следующие, очень простые операторы select принимать какие-либо блокировки
Это распространенное заблуждение , что SELECT
запрос работает на по умолчанию READ COMMITTED
уровня изоляции транзакции будет всегда берет разделяемые блокировки для предотвращения грязного чтения.
SQL Server может избежать принятия общих блокировок на уровне строк, когда нет опасности чтения незафиксированных данных без них (хотя все еще используются блокировки более высокого уровня Intent-Shared (IS)).
Даже если общие блокировки строк будут приняты (возможно , потому , что другая параллельная транзакция изменила страницу строка включена) , они могут быть освобождены задолго до SELECT
Завершает заявление.
В большинстве случаев строка разблокируется непосредственно перед тем, как сервер обработает следующую строку. Существуют обстоятельства, при которых общие блокировки, принятые на уровне изоляции по умолчанию, сохраняются до конца текущего оператора, но не до конца транзакции .
Переопределение текущего уровня изоляции с помощью NOLOCK
табличной подсказки почти всегда является плохой идеей .
Блокировка - это деталь реализации. SQL Server принимает блокировки при необходимости, чтобы гарантировать, что он соответствует семантическим гарантиям, предоставляемым текущим уровнем изоляции . Конечно, бывают моменты, когда полезно немного узнать о причинах взлома блокировок, но попытки предсказать их очень часто приводят к обратным результатам.
SQL Server предоставляет широкий спектр уровней изоляции; выберите тот, который обеспечивает гарантии и поведение, в котором нуждаются ваши потребители данных.