Возможно ли принудительное блокирование уровня строк в SQL Server? - программирование
Подтвердить что ты не робот

Возможно ли принудительное блокирование уровня строк в SQL Server?

Я вижу, как отключить блокировку уровня строк и уровня страницы в SQL Server, но я не могу найти способ заставить SQL Server использовать блокировку на уровне строк. Есть ли способ заставить SQL Server использовать блокировку на уровне строк и НЕ использовать блокировку уровня страницы?

4b9b3361

Ответ 1

Вы можете использовать подсказку ROWLOCK, но AFAIK SQL может решить ее эскалацию, если она работает на ресурсах

Из doco:

ROWLOCK Указывает, что блокировки строк когда блокировки страниц или таблиц обычно принимается. Когда указано в транзакции, действующие на SNAPSHOT уровень изоляции, блокировки строк не если ROWLOCK не сочетается с другие табличные подсказки, которые требуют блокировок, таких как UPDLOCK и HOLDLOCK.

и

Блокировать подсказки ROWLOCK, UPDLOCK и XLOCK которые могут занять блокировки на уровне строк блокировки на индексных ключах, а не на фактические строки данных. Например, если таблица имеет некластеризованный индекс, а Вызов SELECT с использованием подсказки блокировки обрабатываемый индексом покрытия, блокировка приобретенных на индексном ключе в охватывающий индекс, а не данные строка в базовой таблице.

И, наконец, это дает довольно подробное объяснение эскалации блокировки в SQL Server 2005, которая была изменена в SQL Server 2008.

Существует также самая глубокая: Блокировка в блоке базы данных (в книгах онлайн)

Итак, вообще говоря,

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

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

Ответ 2

Используйте предложение ALLOW_PAGE_LOCKS ALTER/CREATE INDEX:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);