Можно ли заставлять блокировку уровня строк в SQL Server?
-
29-09-2019 - |
Вопрос
Я вижу, как отключить уровень строк и блокировку уровня страниц в SQL Server, но я не могу найти способ заставить SQL Server для использования блокировки уровня строк. Есть ли способ заставить SQL Server использовать блокировку уровня строк и не использовать блокировку уровня страниц?
Решение
Вы можете использовать подсказку Rowlock, но Afaik SQL может решить обострить его, если он работает низко
Rowlock указывает, что блокировки строк принимаются, когда обычно принимаются блокировки страниц или таблицы. При указании в транзакциях, работающих на уровне выделения снимков, блокировки строк не принимаются, если Rowlock не сочетается с другими подсказками таблицы, которые требуют блокировки, таких как Updlock и Holdlock.
и
Замок намекает на Rowlock, Updlock и Xlock, которые приобретают блокировки на уровне строк, могут размещать блокировки на ключах индекса, а не фактические строки данных. Например, если таблица имеет некластеризированный индекс, а оператор SELECT с использованием подсказки блокировки обрабатывается индексом покрытия, блокировка получает в клавиш индекса в индексе покрытия, а не в строке данных в базовой таблице.
И наконец Это дает довольно подробное объяснение о эскалации блокировки в SQL Server 2005, которое было изменено в SQL Server 2008.
Есть также, очень глубоко: Блокировка в двигателе базы данных (в книгах онлайн)
Итак, в целом
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
Должно быть в порядке, но в зависимости от индексов и загрузки на сервере, он может в конечном итоге переходить к блокировке страницы.
Другие советы
Используйте пункт alluck_page_locks Изменить/создать индекс:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
Вы не можете заставить оптимизатора что -либо делать, но вы можете направить это.
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
Видеть - Управление SQL Server с помощью блокировки и подсказок