Comment annuler une demande de verrouillage d'application dans SQL Server?

25

La procédure stockée sp_getapplock a les valeurs de retour suivantes:

0: le verrou a été accordé avec succès de manière synchrone.
1: Le verrou a été accordé avec succès après avoir attendu que d'autres verrous incompatibles soient libérés.
-1: la demande de verrouillage a expiré.
-2: La demande de verrouillage a été annulée.
-3: La demande de verrouillage a été choisie comme victime d'un blocage.
-999: indique une validation de paramètre ou une autre erreur d'appel.

J'écris un wrapper pour appeler sp_getapplockdans notre couche d'accès aux données et je veux savoir dans quelles circonstances -2 peut être retourné pour que je puisse lever une exception descriptive et utile. Il est évident ce que signifient les valeurs de retour de -1 et -3 et je peux facilement créer des conditions de test qui provoquent le retour de ces valeurs. Comment pourrais-je obtenir une valeur de retour de -2?

Heinzi
la source

Réponses:

5

En regardant la source du sp_getapplockprocessus wrapper, toutes les valeurs de retour, à l'exception de -999, proviennent de la sys.xp_userlock procédure stockée interne sous-jacente . Je parie que le processus interne renvoie un -2 lorsque la demande est annulée par un événement d'attention (délai d'expiration de la requête client ou explication d'annulation de la requête client). Cependant, aucun autre sp_getapplockcode ne s'exécute après l'annulation du lot, y compris l' RETURNinstruction. Par conséquent, le code de retour -2 peut être renvoyé en interne, mais il n'existe aucun moyen pratique pour le client d'obtenir la valeur.

En supposant que cette théorie est correcte, il n'y a aucune valeur à traduire en -2 vers un message plus descriptif car c'est le client qui a annulé la demande en premier lieu.

Je laisse le soin à Paul de confirmer cela en parcourant le code du moteur de base de données SQL avec un débogueur :-)

Dan Guzman
la source
1

sp_getapplock crée des verrous sur les sémaphores, pas sur les objets physiques (par MSDN). Il ne bloquera un autre processus que s'il est sp_getapplock avec la même chaîne et un mode de verrouillage incompatible.

Ainsi, les demandes de verrouillage seraient annulées dans des circonstances telles que: un utilisateur avec des privilèges plus élevés annule le verrouillage, un processus serveur annule le verrouillage, l'utilisateur exécutant la procédure stockée ou un administrateur tue le processus de verrouillage. Votre description peut être "verrouillage annulé par le système ou un autre utilisateur". Je ne sais pas comment vous détermineriez le processus / l'utilisateur réel qui a annulé le verrouillage.

Ben Schmeltzer
la source
-1

Il existe une procédure stockée correspondante de verrouillage de l'application Release appelée sp_releaseapplock.

J'ai écrit un article intitulé "Mutexes in SQL" ici sur SQL Server Central sur l'utilisation de ces procédures stockées pour contrôler le flux des applications.

Toby
la source
4
On dirait que vous répondez à la question dans le titre mais la vraie question est "Dans quelles circonstances sp_getapplock retournera -2?"
Martin Smith
Demande de verrouillage annulée. En effet, c'est étrange. Comment le processus annulerait-il sa propre demande de verrou sans savoir qu'il a été annulé! Vous devrez peut-être accepter que vous ne pouvez pas donner une erreur significative autre que celle fournie par MS - "La demande de verrouillage a été annulée".
Toby