Share via


Tiempo de espera para bloqueo

Cuando Microsoft SQL Server Compact 4.0 no puede conceder un bloqueo a una transacción de un recurso porque otra transacción ya posee un bloqueo en conflicto en ese recurso, la transacción que solicita el bloqueo se bloquea hasta que la otra transacción lo libera. Esta situación también puede deberse a un interbloqueo. SQL Server Compact 4.0 tiene un periodo predeterminado de tiempo de espera para bloqueo de dos segundos. No hay forma de probar si un recurso está bloqueado antes de bloquearlo, salvo intentando obtener acceso a los datos y, potencialmente, superar el tiempo de espera.

Nota

Puede utilizar la vista del sistema sys.lock_information para determinar si se está bloqueando una solicitud de bloqueo y para ayudar a determinar qué la está bloqueando. Para obtener más información, vea Mostrar la información de bloqueo.

El valor LOCK_TIMEOUT permite que una aplicación establezca un tiempo máximo para que una instrucción espere un recurso bloqueado. Cuando una instrucción ha esperado más de lo especificado en el valor LOCK_TIMEOUT, la instrucción bloqueada se cancela automáticamente y el mensaje de error SSCE_M_LOCKTIMEOUT, "Se superó el tiempo de espera del sistema esperando un bloqueo" se devuelve a la aplicación. No obstante, SQL Server Compact 4.0 no revierte ni cancela ninguna transacción que contenga la instrucción. La aplicación debe tener un controlador de errores que pueda capturar el mensaje de error SSCE_M_LOCKTIMEOUT. Si la aplicación no captura el error, puede continuar sin saber que se ha cancelado una instrucción individual dentro de una transacción. Se pueden producir errores ya que las instrucciones posteriores de la transacción podrían depender de la instrucción que no se ha ejecutado.

La implementación de un controlador de errores que atrape el mensaje de error SSCE_M_LOCKTIMEOUT permite a una aplicación controlar el tiempo de espera y realizar una acción de saneamiento como, por ejemplo, volver a enviar automáticamente la instrucción bloqueada o revertir toda la transacción.

Para establecer el valor LOCK_TIMEOUT actual para una sesión, ejecute la sintaxis SET LOCK_TIMEOUT como se muestra en el siguiente ejemplo de código:

SET LOCK_TIMEOUT 2000;

Vea también

Conceptos

Descripción de bloqueos

Nivel de aislamiento de transacción

Sugerencias de bloqueo