Я вижу, как выключить уровень строки и уровень страницы, привязывающий SQL Server, но я не могу найти способ вынудить SQL Server использовать блокировку уровня строки. Существует ли способ вынудить SQL Server использовать блокировку уровня строки и НЕ блокировку уровня страницы использования?
Вы можете использовать подсказку ROWLOCK, но AFAIK SQL может решить увеличить ее, если у него закончились ресурсы
ROWLOCK Указывает, что блокировки строки когда блокировки страниц или таблиц обычно. Когда указано в транзакциях, работающих на уровне изоляции SNAPSHOT уровень изоляции, блокировки строк не снимаются, если только ROWLOCK не сочетается с другими подсказками таблицы, требующими блокировок, такими как UPDLOCK и HOLDLOCK.
и
Подсказки блокировки ROWLOCK, UPDLOCK, И XLOCK которые приобретают блокировки на уровне строк, могут накладывать блокировки на индексные ключи, а не на фактические строки данных. Например, если таблица имеет некластеризованный индекс, а оператор оператор SELECT, использующий подсказку блокировки, обрабатывается обрабатывается покрывающим индексом, блокировка приобретается на индексный ключ в покрывающем индексе, а не на строке данных строке данных в базовой таблице.
И наконец здесь дается довольно подробное объяснение эскалации блокировки в SQL Server 2005, которая была изменена в SQL Server 2008.
Есть также очень подробный материал: Locking in The Database Engine (в книгах онлайн)
Итак, в целом
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
Все должно быть нормально, но в зависимости от индексов и нагрузки на сервер это может закончиться эскалацией блокировки страницы.
Используйте пункт ALLOW_PAGE_LOCKS в ALTER/CREATE INDEX:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Вы не можете заставить оптимизатор что-либо делать, но можете управлять им.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
См. - Управление SQL Server с помощью блокировки и подсказок