Подсказки блокировок

Подсказки блокировок можно указывать при ссылках на отдельные таблицы в инструкциях SELECT, INSERT, UPDATE и DELETE. Подсказки указывают тип блокировки или управления версиями строк, который будет использоваться экземпляром SQL Server Database Engine при работе с данными таблицы. Подсказки блокировок на табличном уровне можно использовать, когда требуется более подробное управление типом получаемых для объекта блокировок. Эти подсказки имеют приоритет относительно текущего уровня изоляции транзакций в сеансе.

Дополнительные сведения о различных подсказках блокировки и их действии см. в разделе Табличные подсказки (Transact-SQL).

ПримечаниеПримечание

Оптимизатор запросов компонента Database Engine почти всегда выбирает оптимальный уровень блокировки. Для изменения блокировок по умолчанию подсказки блокировок на уровне таблицы рекомендуется использовать только при необходимости. Изменение уровня блокировок может неблагоприятно повлиять на параллельную работу пользователей.

Компоненту Database Engine могут потребоваться блокировки при чтении метаданных, даже при выполнении инструкции SELECT с подсказкой по блокировке, предотвращающей запросы на блокировки при чтении данных. Например, инструкция SELECT с подсказкой NOLOCK не получает разделяемых блокировок при чтении данных, но иногда может запросить блокировку при чтении представления системного каталога. Из этого следует, что возможна блокировка инструкции SELECT с указанием NOLOCK.

Как показано в следующем примере, если устанавливается уровень изоляции транзакций SERIALIZABLE и используется подсказка блокировки табличного уровня NOLOCK в инструкции SELECT, то блокировки диапазонов значений ключа, обычно используемые для обеспечения сериализуемости транзакций, не получаются.

USE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
    FROM HumanResources.Employee WITH (NOLOCK);
GO

-- Get information about the locks held by 
-- the transaction.
SELECT  
        resource_type, 
        resource_subtype, 
        request_mode
    FROM sys.dm_tran_locks
    WHERE request_session_id = @@spid;

-- End the transaction.
ROLLBACK;
GO

Единственная получаемая блокировка, ссылающаяся на HumanResources.Employee, это блокировка стабильности схемы (Sch-S). В этом случае сериализуемость не гарантируется.

В SQL Server 2008 параметр LOCK_ESCALATION инструкции ALTER TABLE может вызывать конфликт с блокировками таблицы и разрешить блокировки HoBT для секционированных таблиц. Этот параметр не является подсказкой блокировки, но позволяет снизить укрупнение блокировок. Дополнительные сведения см. в разделе ALTER TABLE (Transact-SQL).