Возможно ли принудительное блокирование на уровне строк в SQL Server? - PullRequest
53 голосов
/ 25 июня 2010

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

Ответы [ 3 ]

31 голосов
/ 25 июня 2010

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

Из документа :

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

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

14 голосов
/ 25 июня 2010

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

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
8 голосов
/ 25 июня 2010

Вы не можете заставить оптимизатор что-либо делать, но вы можете это сделать.

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

См. - Управление SQL-сервером с помощью блокировки и подсказок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...