Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Datenbanken erstellen » Transaktionen und Isolationsstufen verwenden » Transaktion blockieren und Deadlock » Transaktion blockieren

 

Deadlock

Das Blockieren von Transaktionen kann zu einem Deadlock führen, wobei sich mehrere Transaktionen in einem Zustand befinden, in dem keine mehr weiter verarbeitet werden kann.

Gründe für einen Deadlock

Ein Deadlock kann aus zwei Gründen entstehen:

  • Zyklischer Blockierkonflikt   Transaktion A wird durch Transaktion B blockiert, und Transaktion B wird durch Transaktion A blockiert. Mehr Zeit wird hier das Problem sicherlich nicht lösen. Eine der Transaktionen muss abgebrochen werden, damit die andere fortfahren kann. Die gleiche Situation kann auch entstehen, wenn mehr als zwei Transaktionen in einem Zyklus blockiert sind.

  • Alle aktiven Datenbank-Threads sind blockiert   Wenn eine Transaktion blockiert wird, erfolgt keine Freigabe Ihres Datenbank-Threads. Wird ein Server mit drei Threads konfiguriert, und die Transaktionen A, B und C werden durch die Transaktion D blockiert, die derzeit keine Anforderungen ausführt, dann ist eine Deadlock-Situation entstanden, da es keine verfügbaren Threads mehr gibt.

Um einen transaktionalen Deadlock zu eliminieren, wählt SQL Anywhere eine am Deadlock beteiligte Verbindung aus, setzt die Änderungen für die auf dieser Verbindung aktive Transaktion zurück und meldet einen Fehler. SQL Anywhere wählt die zurückzusetzende Verbindung unter Verwendung eines internen heuristischen Werts aus, der die Verbindung mit der kürzesten verbliebenen Wartezeit bevorzugt, wie von der Option "blocking_timeout" festgelegt. Wenn alle Verbindungen auf unbegrenzten Wartezustand gesetzt sind, wird die Verbindung, die bewirkte, dass der Datenbankserver den Deadlock erkannte, als Opferverbindung ausgewählt.

Um einen Thread-Deadlock zu eliminieren, wählt SQL Anywhere den letzten Thread-Block aus, setzt die Änderungen für die auf dieser Verbindung aktive Transaktion zurück und meldet einen Fehler.

Die Anzahl der Datenbank-Threads, die der Server benutzt, hängt von den jeweiligen Datenbankeinstellungen ab.

Hinweise darüber, wie Sie die Anzahl der Datenbank-Threads einstellen, finden Sie unter Steuerung des Thread-Verhaltens.


Blockierte Transaktion ermitteln
Deadlocks aus Sybase Central anzeigen