Freigeben über


Anpassen des Timeouts für Sperren

Wenn eine Instanz von Microsoft SQL Server Database Engine (Datenbankmodul) einer Transaktion keine Sperre für eine Ressource erteilen kann, da eine andere Transaktion bereits eine Sperre für diese Ressource besitzt, die im Widerspruch dazu steht, wird die erste Transaktion blockiert, während sie darauf wartet, dass die vorhandene Sperre aufgehoben wird. Standardmäßig gibt es keinen obligatorischen Timeoutzeitraum und keine Möglichkeit, im Voraus zu testen, ob eine Ressource gesperrt ist, außer zu versuchen, auf die Daten zuzugreifen (und eventuell auf unbestimmte Zeit blockiert zu werden).

HinweisHinweis

Verwenden Sie die dynamische Verwaltungssicht sys.dm_os_waiting_tasks in SQL Server, um zu bestimmen, ob und wodurch ein Prozess blockiert ist. Verwenden Sie die gespeicherte Systemprozedur sp_who in früheren Versionen von SQL Server.

Mithilfe der LOCK_TIMEOUT-Einstellung kann eine Anwendung eine Zeitspanne festlegen, die angibt, wie lange eine Anweisung auf eine blockierte Ressource maximal wartet. Wenn eine Anweisung länger wartet als in der LOCK_TIMEOUT-Einstellung angegeben, wird die blockierte Anweisung automatisch abgebrochen und die Fehlermeldung 1222 (Lock request time-out period exceeded) an die Anwendung zurückgegeben. Für eine Transaktion, in der diese Anweisung enthalten ist, wird jedoch von SQL Server kein Rollback ausgeführt, und sie wird nicht abgebrochen. Deshalb muss die Anwendung über einen Fehlerhandler verfügen, der die Fehlermeldung 1222 auffangen kann. Ist dies nicht der Fall, kann die Anwendung fortfahren, ohne zu erkennen, dass eine einzelne Anweisung in einer Transaktion abgebrochen wurde. Es können dann Fehler auftreten, da nachfolgende Anweisungen in der Transaktion von der nicht ausgeführten Anweisung abhängen können.

Durch das Implementieren eines Fehlerhandlers, der die Fehlermeldung 1222 auffängt, kann eine Anwendung die Timeoutbedingung bearbeiten und Abhilfemaßnahmen ergreifen, wie etwa die vormals blockierte Anforderung automatisch erneut zu senden oder für die gesamte Transaktion einen Rollback auszuführen.

Wenn Sie die aktuelle LOCK_TIMEOUT-Einstellung ermitteln möchten, führen Sie die @@LOCK_TIMEOUT-Funktion wie im folgenden Beispiel aus:

SELECT @@lock_timeout;
GO