Sugerencias de bloqueo

Se pueden especificar sugerencias de bloqueo para referencias de tablas individuales en las instrucciones SELECT, INSERT, UPDATE y DELETE. Las sugerencias especifican el tipo de bloqueo o las versiones de filas que utiliza la instancia de SQL Server Database Engine (Motor de base de datos de SQL Server) para los datos de la tabla. Se pueden utilizar las sugerencias de bloqueo de tabla cuando se requiere un control más ajustado de los tipos de bloqueo adquiridos en un objeto. Estas sugerencias de bloqueo suplantan el nivel de aislamiento de la transacción actual durante la sesión.

Para obtener más información acerca de las sugerencias de bloqueo específicas y sus comportamientos, vea Sugerencias de tabla (Transact-SQL).

Nota

El optimizador de consultas del Motor de base de datos suele elegir el nivel de bloqueo correcto. Se recomienda utilizar las sugerencias de bloqueo de tabla para modificar el comportamiento de bloqueo predeterminado en los casos estrictamente necesarios. Impedir un nivel de bloqueo puede ir en detrimento de la simultaneidad.

El Motor de base de datos podría verse forzado a adquirir bloqueos al leer los metadatos, incluso cuando procese una instrucción SELECT con una sugerencia de bloqueo que impida a las solicitudes compartir bloqueos al leer los datos. Por ejemplo, una instrucción SELECT que utiliza la sugerencia NOLOCK no adquiere bloqueos compartidos al leer los datos, pero podría solicitar bloqueos en alguna oportunidad al leer la vista de catálogo del sistema. Esto significa que es posible que una instrucción SELECT que utilice NOLOCK esté bloqueada.

Según se muestra en el siguiente ejemplo, si se establece el nivel de aislamiento de la transacción en SERIALIZABLE y se utiliza la sugerencia de bloqueo de nivel de tabla NOLOCK con la instrucción SELECT, no se aplican los bloqueos de intervalos de claves usados normalmente para mantener las transacciones serializables.

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

El único bloqueo utilizado que hace referencia a HumanResources.Employee es un bloqueo de estabilidad de esquema (Sch-S). En este caso, ya no se garantiza la serialidad.

En SQL Server 2008, la opción LOCK_ESCALATION de ALTER TABLE puede penalizar los bloqueos de tabla y habilitar los bloqueos HoBT en tablas con particiones. Esta opción no es una sugerencia de bloqueo, pero puede utilizarse para reducir la extensión de los bloqueos. Para obtener más información, vea ALTER TABLE (Transact-SQL).