web-dev-qa-db-fra.com

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

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_getapplock dans notre couche d'accès aux données et je veux savoir dans quelles circonstances -2 peut être renvoyé 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?

25
Heinzi

En regardant la source du sp_getapplock wrapper proc, toutes les valeurs renvoyées à l'exception de -999 proviennent du sous-jacent sys.xp_userlock procédure stockée interne. 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, pas d'autre sp_getapplock le code s'exécute après l'annulation du lot, y compris l'instruction RETURN. 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 à Paul le soin de le confirmer en parcourant le code du moteur de base de données SQL avec un débogueur :-)

6
Dan Guzman

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.

1
Ben Schmeltzer