Действительно ли возможно вызвать уровень строки, привязывающий SQL Server?

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

54
задан Elan 24 June 2010 в 13:23
поделиться

3 ответа

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

Из doco:

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

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

32
ответ дан 7 November 2019 в 08:08
поделиться

Используйте пункт ALLOW_PAGE_LOCKS в ALTER/CREATE INDEX:

ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
14
ответ дан 7 November 2019 в 08:08
поделиться

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

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

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

8
ответ дан 7 November 2019 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: