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.
In dieser praktischen Einführung wird vorausgesetzt, dass Sie die Testdatenbank app_profiling.db erstellt haben.
Verbinden Sie sich wie folgt mit app_profiling.db:
Klicken Sie in Sybase Central im SQL Anywhere 12-Plug-In auf Verbindungen » Verbinden mit SQL Anywhere 12.
Füllen Sie im Fenster Verbinden die folgenden Felder aus, um eine Verbindung mit der Testdatenbank app_profiling.db herzustellen.
Authentifizierung Datenbank
Benutzer-ID DBA
Kennwort sql
Aktion Eine Datenbank auf diesem Computer starten
Datenbankdatei C:\AppProfilingTutorial\app_profiling.db
Startzeile dbeng12 -x tcpip
Klicken Sie auf Verbinden.
Klicken Sie im linken Fensterausschnitt auf app_profiling - DBA und anschließend auf 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: Erstellen eines Deadlocks und Aufzeichnen von Informationen darüber.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |