Personalizar el tiempo de espera de bloqueo

Cuando una instancia del SQL Server Database Engine (Motor de base de datos de SQL Server) de Microsoft no puede conceder un bloqueo a una transacción porque otra transacción ya posee un bloqueo en conflicto en el recurso, la primera transacción queda bloqueada a la espera de que se libere el bloqueo existente. De forma predeterminada no hay un tiempo de espera obligatorio, ni tampoco existe ningún modo de comprobar si un recurso está bloqueado antes de intentar bloquearlo, excepto intentar tener acceso a los datos (con el riesgo de quedar bloqueado indefinidamente).

Nota

En SQL Server, use la vista de administración dinámica sys.dm_os_waiting_tasks para determinar si un proceso está bloqueado y quién lo bloquea. En versiones anteriores de SQL Server, use el procedimiento almacenado del sistema sp_who.

El parámetro LOCK_TIMEOUT permite a una aplicación establecer el tiempo máximo que una instrucción esperará a un recurso bloqueado. Cuando una instrucción ha esperado más tiempo del indicado en LOCK_TIMEOUT, la instrucción bloqueada se cancela automáticamente y se devuelve el mensaje de error 1222 (Lock request time-out period exceeded) a la aplicación. Sin embargo, SQL Server no cancela ni revierte ninguna transacción que contenga la instrucción. Por tanto, la aplicación debe contener un controlador de errores que pueda interceptar el mensaje de error 1222. Si una aplicación no intercepta el error, puede continuar sin ser consciente de que se ha cancelado una instrucción individual de la transacción y de que esto puede producir errores, ya que las instrucciones posteriores de la transacción podrían depender de la instrucción que nunca se ejecutó.

Al implementar un controlador de errores que intercepte el mensaje de error 1222 se permite a una aplicación controlar la situación de tiempo de espera y realizar una acción apropiada para solucionarla, como volver a enviar automáticamente la instrucción bloqueada o revertir la transacción completa.

Para determinar el valor actual de LOCK_TIMEOUT, ejecute la función @@LOCK_TIMEOUT:

SELECT @@lock_timeout;
GO