Freigeben über


sp_getapplock (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Sperrt eine Anwendungsressource.

Transact-SQL-Syntaxkonventionen

Syntax

sp_getapplock
    [ [ @Resource = ] N'Resource' ]
    , [ @LockMode = ] 'LockMode'
    [ , [ @LockOwner = ] 'LockOwner' ]
    [ , [ @LockTimeout = ] LockTimeout ]
    [ , [ @DbPrincipal = ] N'DbPrincipal' ]
[ ; ]

Argumente

[ @Resource = ] N'Ressource'

Eine Zeichenfolge, die einen Namen angibt, der die Sperrressource identifiziert. @Resource ist nvarchar(255), mit einem Standardwert von NULL. Wenn eine Ressourcenzeichenfolge länger als nvarchar(255)ist, wird der Wert auf nvarchar(255)abgeschnitten.

Die Anwendung muss sicherstellen, dass der Ressourcenname eindeutig ist. Der angegebene Name wird intern in einen Wert gehasht, der im SQL Server-Sperr-Manager gespeichert werden kann.

@Resource ist binär verglichen und berücksichtigt daher die Groß-/Kleinschreibung unabhängig von den Sortiereinstellungen der aktuellen Datenbank.

Hinweis

Nachdem eine Anwendungssperre eingerichtet wurde, können nur die ersten 32 Zeichen im Nur-Text-Format abgerufen werden. Die übrigen Zeichen werden hashcodiert.

[ @LockMode = ] 'LockMode'

Der Sperrmodus, der für eine bestimmte Ressource abgerufen werden soll. @LockMode ist varchar(32) ohne Standard und ist einer der folgenden Werte:

  • Shared
  • Update
  • IntentShared
  • IntentExclusive
  • Exclusive

Weitere Informationen finden Sie unter "Sperrmodi".

[ @LockOwner = ] 'LockOwner'

Der Besitzer der Sperre, bei dem es sich um den @LockOwner Wert handelt, als die Sperre angefordert wurde. @LockOwner ist varchar(32) mit einem Standardwert von Transaction. Der Wert kann auch sein Session. Wenn der @LockOwner Wert standardmäßig oder explizit angegeben ist Transaction, sp_getapplock muss innerhalb einer Transaktion ausgeführt werden.

[ @LockTimeout = ] LockTimeout

Ein Timeoutwert für das Sperren in Millisekunden. @LockTimeout ist int, und der Standardwert ist identisch mit dem von @@LOCK_TIMEOUT. Ein Wert von -1 (Standard) gibt keinen Timeoutzeitraum an (d. s. für immer warten). Um anzugeben, dass eine Sperranforderung einen Rückgabecode -1 zurückgeben soll, statt auf die Sperre zu warten, wenn die Anforderung nicht sofort gewährt werden kann, geben Sie an 0.

[ @DbPrincipal = ] N'DbPrincipal'

Die Benutzer-, Rollen- oder Anwendungsrolle, die Berechtigungen für ein Objekt in einer Datenbank besitzt. @DbPrincipal ist "sysname" mit einem Standardwert von public. Der Aufrufer der Funktion muss ein Element von database_principal, dbo oder der db_owner festen Datenbankrolle sein, um die Funktion erfolgreich aufzurufen. Der Standardwert ist öffentlich.

Rückgabecodewerte

>= 0 (Erfolg) oder < 0 (Fehler).

Wert Ergebnis
0 Die Sperre wurde erfolgreich synchron erteilt.
1 Die Sperre wurde erfolgreich erteilt, nachdem das Aufheben anderer, inkompatibler Sperren abgewartet wurde.
-1 Timeout für die Sperranforderung.
-2 Die Sperranforderung wurde abgebrochen.
-3 Die Sperranforderung wurde als Deadlockopfer gewählt.
-999 Gibt einen Fehler bei Parameterüberprüfung oder einen anderen Aufruffehler an.

Hinweise

Für eine Ressource bestehende Sperren sind der aktuellen Transaktion oder der aktuellen Sitzung zugeordnet. Der aktuellen Transaktion zugeordnete Sperren werden aufgehoben, wenn für die Transaktion ein Commit oder ein Rollback ausgeführt wird. Sperrungen, die der Sitzung zugeordnet sind, werden freigegeben, wenn die Sitzung abgemeldet wird. Wenn der Server aus irgendeinem Grund heruntergefahren wird, werden alle Sperren freigegeben.

Die von sp_getapplock der Sperre erstellte Ressource wird in der aktuellen Datenbank für die Sitzung erstellt. Jede Sperrenressource wird durch die kombinierten Werte folgender Elemente identifiziert:

  • Die Datenbank-ID der Datenbank, die die Sperrenressource enthält.
  • Der im @DbPrincipal-Parameter angegebene Datenbankprinzipal.
  • Der im @Resource-Parameter angegebene Name für die Sperre.

Nur ein Im @DbPrincipal Parameter angegebenes Element des Datenbankprinzipals kann Anwendungssperren abrufen, die diesen Prinzipal angeben. Mitglieder der Rollen "dbo " und "db_owner " werden implizit als Mitglieder aller Rollen betrachtet.

Sperren können explizit freigegeben werden mit sp_releaseapplock. Wenn eine Anwendung mehrmals für dieselbe Sperrressource aufruft sp_getapplock , muss dieselbe Anzahl von Male aufgerufen werden, sp_releaseapplock um die Sperre freizugeben. Wenn eine Sperre mit dem Transaction Sperrbesitzer geöffnet wird, wird diese Sperre freigegeben, wenn die Transaktion zugesichert oder zurückgesetzt wird.

Wenn sp_getapplock für dieselbe Sperrressource mehrmals aufgerufen wird, aber der in einer der Anforderungen angegebene Sperrmodus nicht mit dem vorhandenen Modus übereinstimmt, ist der Effekt auf die Ressource eine Vereinigung der beiden Sperrmodi. In den meisten Fällen bedeutet dies, dass der Sperrmodus zum Stärkeren der Sperrmodi, d. h. des vorhandenen oder des neu angeforderten, heraufgestuft wird. Dieser stärkere Sperrmodus wird gehalten, bis die Sperre letztendlich freigegeben wird, auch wenn Sperrfreigabeanrufe vor diesem Zeitpunkt auftreten.

In der folgenden Aufrufsequenz bleibt die Ressource im Exclusive-Modus und nicht im Shared-Modus.

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result INT;

EXEC @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

EXEC @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

EXEC @result = sp_releaseapplock @Resource = 'Form1';

COMMIT TRANSACTION;
GO

Ein Deadlock mit einer Anwendungssperre rollt die Transaktion, die die Anwendungssperre angefordert hat, nicht zurück. Jeder Rollback, der möglicherweise als Ergebnis des Rückgabewertes benötigt wird, muss manuell ausgeführt werden. Daher wird empfohlen, dass die Fehlerüberprüfung im Code enthalten ist, sodass beim Zurückgeben bestimmter Werte (z -3. B. ) eine ROLLBACK TRANSACTION oder eine alternative Aktion initiiert wird.

Ein Beispiel:

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result INT;

EXEC @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

IF @result = -3
BEGIN
    ROLLBACK TRANSACTION;
END
ELSE
BEGIN
    EXEC @result = sp_releaseapplock @Resource = 'Form1';

    COMMIT TRANSACTION;
END;
GO

SQL Server verwendet die aktuelle Datenbank-ID, um die Ressource zu qualifizieren. sp_getapplock Wenn sie ausgeführt wird, auch bei identischen Parameterwerten in verschiedenen Datenbanken, ist das Ergebnis daher separate Sperren für separate Ressourcen.

Verwenden Sie die sys.dm_tran_locks dynamische Verwaltungsansicht oder die sp_lock gespeicherte Systemprozedur, um Sperrinformationen zu untersuchen, oder verwenden Sie SQL Server Profiler, um Sperren zu überwachen.

Berechtigungen

Erfordert die Mitgliedschaft in der public -Rolle.

Beispiele

Im folgenden Beispiel wird eine freigegebene Sperre, die der aktuellen Transaktion zugeordnet ist, für die Form1-Ressource in der AdventureWorks2022-Datenbank eingerichtet.

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result INT;

EXEC @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO

Im folgenden Beispiel wird dbo als Datenbankprinzipal angegeben.

BEGIN TRANSACTION;

EXEC sp_getapplock
    @DbPrincipal = 'dbo',
    @Resource = 'AdventureWorks2022',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO