Deadlocks treten auf, wenn zwei oder mehr Transaktionen einander blockieren. Beispiel: Transaktion A erfordert Zugriff auf Tabelle B, aber Tabelle B ist von Transaktion B gesperrt. Transaktion B erfordert Zugriff auf Tabelle A, aber Tabelle A ist von Transaktion A gesperrt. Es entsteht ein zyklischer Blockierungskonflikt.
Ein Anzeichen für Deadlocks ist die Rückgabe von SQLCODE -306 und -307. Um einen Deadlock aufzulösen, setzt SQL Anywhere automatisch die letzte Anweisung zurück, die den Deadlock bewirkt hat. Es entstehen Performanceprobleme, wenn Anweisungen fortwährend zurückgesetzt werden.
Für diese praktische Einführung wird vorausgesetzt, dass Sie die Testdatenbank erstellt haben, app_profiling.db. Wenn dies nicht der Fall ist, finden Sie weitere Hinweise unter Eine Testdatenbank für die praktischen Einführungen in die Anwendungsprofilerstellung erstellen.
Verbinden Sie sich wie folgt mit app_profiling.db:
Wählen Sie in Sybase Central im SQL Anywhere 12-Plug-In Verbindungen » Verbinden mit SQL Anywhere 12.
Im Fenster Verbinden füllen Sie die folgenden Felder aus, um eine Verbindung mit der Testdatenbank app_profiling.db herzustellen, und klicken Sie dann auf Verbinden:
Authentifizierung Datenbank
Benutzer-ID DBA
Kennwort sql
Aktion Eine Datenbank auf diesem Computer starten
Datenbankdatei C:\AppProfilingTutorial\app_profiling.db
Startzeile dbeng12 -x tcpip
Im linken Fensterausschnitt klicken Sie auf app_profiling - DBA und wählen Sie dann Datei » Interactive SQL öffnen.
Interactive SQL wird gestartet und stellt eine Verbindung mit der Datenbank app_profiling.db her.
In Interactive SQL:
Führen Sie die folgenden SQL-Anweisungen aus, um zwei Tabellen zu erstellen, die Sie später zur Erstellung des Deadlocks verwenden werden:
CREATE TABLE "DBA"."deadlock1" ( "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, "val" CHAR(1) ); CREATE TABLE "DBA"."deadlock2" ( "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, "val" CHAR(1) ); |
Führen Sie die folgenden SQL-Anweisungen aus, um Werte in beide Tabellen einzufügen:
INSERT INTO "deadlock1"("val") VALUES('x'); INSERT INTO "deadlock2"("val") VALUES('x'); |
Führen Sie die folgenden SQL-Anweisungen aus, um zwei Prozeduren zu erstellen, die Sie später zur Verursachung des Deadlocks verwenden werden:
CREATE PROCEDURE "DBA"."proc_deadlock1"( ) BEGIN LOCK TABLE "DBA"."deadlock1" IN EXCLUSIVE MODE; WAITFOR DELAY '00:00:20:000'; UPDATE deadlock2 SET val='y'; END; CREATE PROCEDURE "DBA"."proc_deadlock2"( ) BEGIN LOCK TABLE "DBA"."deadlock2" IN EXCLUSIVE MODE; WAITFOR DELAY '00:00:20:000'; UPDATE deadlock1 SET val='y'; END; |
Führen Sie die folgenden SQL-Anweisungen aus, um die Änderungen festzuschreiben, die Sie an der Datenbank durchgeführt haben:
COMMIT; |
Schließen Sie Interactive SQL.
Klicken Sie auf diesen Link, um mit der praktischen Einführung fortzufahren: Lektion 2: Einen Deadlock erstellen und Informationen darüber aufzeichnen.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |