¿Cómo cancelo una solicitud de bloqueo de aplicación en SQL Server?

25

El procedimiento almacenado sp_getapplock tiene los siguientes valores de retorno:

0: el bloqueo se otorgó con éxito sincrónicamente.
1: El bloqueo se otorgó con éxito después de esperar a que se liberen otros bloqueos incompatibles.
-1: se agotó el tiempo de espera de la solicitud de bloqueo.
-2: se canceló la solicitud de bloqueo.
-3: La solicitud de bloqueo se eligió como una víctima de punto muerto.
-999: indica una validación de parámetro u otro error de llamada.

Estoy escribiendo un contenedor para llamar sp_getapplocka nuestra capa de acceso a datos y quiero saber en qué circunstancias se puede devolver -2 para poder lanzar una excepción descriptiva y útil. Es obvio lo que significan los valores de retorno de -1 y -3 y puedo crear fácilmente condiciones de prueba que causen que esos valores sean devueltos. ¿Cómo lograría obtener un valor de retorno de -2?

Heinzi
fuente

Respuestas:

5

Mirando la fuente del proceso de sp_getapplockenvoltura, todos los valores de retorno, excepto -999, se originan en el sys.xp_userlock procedimiento almacenado interno subyacente . Apuesto a que el proceso interno devuelve un -2 cuando la solicitud se cancela por un evento de atención (tiempo de espera de la consulta del cliente o cancelación explícita de la consulta del cliente). Sin embargo, no se sp_getapplockejecuta más código después de cancelar el lote, incluida la RETURNdeclaración. En consecuencia, el código de retorno -2 puede devolverse internamente, pero no hay una forma práctica para que el cliente obtenga el valor.

Asumiendo que esta teoría es correcta, no hay ningún valor en traducir de -2 a un mensaje más descriptivo, ya que es el cliente quien canceló la solicitud en primer lugar.

Dejaré que Paul confirme esto revisando el código del motor de la base de datos SQL con un depurador :-)

Dan Guzman
fuente
1

sp_getapplock crea bloqueos en semáforos, no en objetos físicos (por MSDN). Solo bloqueará otro proceso si es sp_getapplock con la misma cadena y un modo de bloqueo incompatible.

Por lo tanto, las solicitudes de bloqueo se cancelarían en circunstancias tales como: un usuario con mayores privilegios cancela el bloqueo, un proceso del servidor cancela el bloqueo, el usuario que ejecuta el procedimiento almacenado o un administrador elimina el proceso de bloqueo. Su descripción podría ser "bloqueo cancelado por el sistema u otro usuario". No estoy seguro de cómo determinaría el proceso / usuario real que canceló el bloqueo.

Ben Schmeltzer
fuente
-1

Hay un procedimiento almacenado de bloqueo de la aplicación Release correspondiente llamado sp_releaseapplock.

Escribí un artículo confusamente titulado "Mutexes in SQL" aquí en SQL Server Central sobre el uso de estos procedimientos almacenados para controlar el flujo de la aplicación.

Toby
fuente
44
Parece que está respondiendo la pregunta en el título, pero la pregunta real es "¿En qué circunstancias sp_getapplock devolverá -2?"
Martin Smith
Solicitud de bloqueo cancelada. De hecho, eso es extraño. ¡Cómo cancelaría el proceso su propia solicitud de bloqueo sin saber que se ha cancelado! Es posible que deba aceptar que no puede dar un error significativo que no sea el que proporciona MS: "Se canceló la solicitud de bloqueo".
Toby