Я вижу, как отключить блокировку уровня строк и уровня страницы в SQL Server, но я не могу найти способ заставить SQL Server использовать блокировку на уровне строк. Есть ли способ заставить SQL Server использовать блокировку на уровне строк и НЕ использовать блокировку уровня страницы?
Возможно ли принудительное блокирование уровня строк в SQL Server?
Ответ 1
Вы можете использовать подсказку ROWLOCK, но AFAIK SQL может решить ее эскалацию, если она работает на ресурсах
ROWLOCK Указывает, что блокировки строк когда блокировки страниц или таблиц обычно принимается. Когда указано в транзакции, действующие на SNAPSHOT уровень изоляции, блокировки строк не если ROWLOCK не сочетается с другие табличные подсказки, которые требуют блокировок, таких как UPDLOCK и HOLDLOCK.
и
Блокировать подсказки ROWLOCK, UPDLOCK и XLOCK которые могут занять блокировки на уровне строк блокировки на индексных ключах, а не на фактические строки данных. Например, если таблица имеет некластеризованный индекс, а Вызов SELECT с использованием подсказки блокировки обрабатываемый индексом покрытия, блокировка приобретенных на индексном ключе в охватывающий индекс, а не данные строка в базовой таблице.
Существует также самая глубокая: Блокировка в блоке базы данных (в книгах онлайн)
Итак, вообще говоря,
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);
Ответ 3
Вы не можете заставить оптимизатора что-либо сделать, но вы можете это сделать.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93