Wie storniere ich eine App-Sperranforderung in SQL Server?

25

Die gespeicherte Prozedur sp_getapplock hat die folgenden Rückgabewerte:

0: Die Sperre wurde erfolgreich synchron erteilt.
1: Die Sperre wurde erfolgreich erteilt, nachdem gewartet wurde, bis andere inkompatible Sperren freigegeben wurden.
-1: Die Sperranforderung ist abgelaufen.
-2: Die Sperranforderung wurde abgebrochen.
-3: Die Sperranforderung wurde als Deadlock-Opfer ausgewählt.
-999: Zeigt eine Parameterüberprüfung oder einen anderen Aufruffehler an.

Ich schreibe einen Wrapper für den Aufruf sp_getapplockunserer Datenzugriffsebene und möchte wissen, unter welchen Umständen -2 zurückgegeben werden kann, damit ich eine beschreibende und hilfreiche Ausnahme auslösen kann. Es ist offensichtlich, was Rückgabewerte von -1 und -3 bedeuten, und ich kann problemlos Testbedingungen erstellen, unter denen diese Werte zurückgegeben werden. Wie würde ich es schaffen, einen Rückgabewert von -2 zu erhalten?

Heinzi
quelle

Antworten:

5

In Bezug auf die Quelle des sp_getapplockWrapper-Prozesses stammen alle Rückgabewerte mit Ausnahme von -999 von der zugrunde liegenden sys.xp_userlock internen gespeicherten Prozedur. Ich wette, die interne Prozedur gibt einen Wert von -2 zurück, wenn die Anforderung durch ein Aufmerksamkeitsereignis abgebrochen wird (Client-Abfrage-Timeout oder expliziter Client-Abfrage-Abbruch). Es wird jedoch kein weiterer sp_getapplockCode ausgeführt, nachdem der Stapel abgebrochen wurde, einschließlich der RETURNAnweisung. Folglich wird der Rückkehrcode -2 möglicherweise intern zurückgegeben, aber der Client kann den Wert nicht auf praktische Weise abrufen.

Vorausgesetzt, diese Theorie ist richtig, hat die Übersetzung von -2 in eine aussagekräftigere Nachricht keinen Wert, da es der Client ist, der die Anforderung an erster Stelle storniert hat.

Ich überlasse es Paul, dies zu bestätigen, indem er mit einem Debugger durch den SQL-Datenbank-Engine-Code geht :-)

Dan Guzman
quelle
1

sp_getapplock erstellt Sperren für Semaphoren, nicht für physische Objekte (per MSDN). Es wird nur dann einen anderen Prozess blockieren, wenn es sich um sp_getapplock mit derselben Zeichenfolge und einem inkompatiblen Sperrmodus handelt.

Daher werden Sperranforderungen unter folgenden Umständen aufgehoben: Ein Benutzer mit höheren Berechtigungen hebt die Sperre auf, ein Serverprozess hebt die Sperre auf, der Benutzer, der die gespeicherte Prozedur ausführt, oder ein Administrator beendet den Sperrprozess. Ihre Beschreibung könnte "Sperre vom System oder einem anderen Benutzer aufgehoben" sein. Ich bin nicht sicher, wie Sie den tatsächlichen Prozess / Benutzer bestimmen würden, der die Sperre aufgehoben hat.

Ben Schmeltzer
quelle
-1

Es gibt eine entsprechende gespeicherte Prozedur zum Freigeben der Anwendungssperre mit dem Namen sp_releaseapplock.

Ich habe hier in SQL Server Central einen verwirrenden Artikel mit dem Titel "Mutexes in SQL" über die Verwendung dieser gespeicherten Prozeduren zur Steuerung des Anwendungsflusses geschrieben.

Toby
quelle
4
Anscheinend beantworten Sie die Frage im Titel, aber die eigentliche Frage lautet: "Unter welchen Umständen gibt sp_getapplock -2 zurück?"
Martin Smith
Sperranfrage abgebrochen. In der Tat ist das eine seltsame. Wie würde der Prozess seine eigene Anfrage nach einer Sperre stornieren, ohne zu wissen, dass sie storniert wurde? Möglicherweise müssen Sie akzeptieren, dass Sie keinen anderen aussagekräftigen Fehler als den von MS angegebenen angeben können - "Sperranforderung wurde abgebrochen".
Toby