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

 

Blockierte Transaktion ermitteln

Sie können die Systemprozedur sa_conn_info verwenden, um zu ermitteln, welche Verbindungen durch andere Verbindungen blockiert sind. Diese Prozedur gibt eine Ergebnismenge zurück, die aus einer Zeile für jede Verbindung besteht. Eine Spalte der Ergebnismenge listet auf, warum die Verbindung blockiert und mit welcher Verbindung diese Blockierung eingetreten ist.

Weitere Hinweise finden Sie unter sa_conn_info-Systemprozedur.

Sie können auch das Deadlock-Ereignis verwenden, um Aktionen durchzuführen, wenn der Deadlock eintritt. Der Event-Handler kann mit der Prozedur sa_report_deadlock Informationen über die Bedingungen erhalten, die zum Deadlock geführt haben. Um weitere Details über den Deadlock vom Datenbankserver abzurufen, verwenden Sie die Option log_deadlocks und die Funktion RememberLastStatement.

Die folgende Prozedur zeigt, wie Sie ein Tabellen- und Systemereignis einrichten, das verwendet werden kann, um Informationen über Deadlocks bei ihrem Auftreten zu beziehen. Wenn bei Ihrer Anwendung häufig Deadlocks auftreten, können Sie die Anwendungsprofilerstellung verwenden, um die Ursache von Deadlocks zu diagnostizieren. Weitere Hinweise finden Sie unter Praktische Einführung: Deadlocks diagnostizieren.

♦  So leiten Sie Aktionen ein, wenn ein Deadlock eintritt
  1. Erstellen Sie eine Tabelle, um die von der Systemprozedur "sa_report_deadlocks" zurückgegebenen Daten zu speichern:

    CREATE TABLE DeadlockDetails(
      deadlockId INT PRIMARY KEY DEFAULT AUTOINCREMENT,
      snapshotId BIGINT,
      snapshotAt TIMESTAMP,
      waiter INTEGER,
      who VARCHAR(128),
      what LONG VARCHAR,
      object_id UNSIGNED BIGINT,
      record_id BIGINT,
      owner INTEGER,
      is_victim BIT,
      rollback_operation_count UNSIGNED INTEGER );
  2. Erstellen Sie ein Ereignis, das ausgelöst wird, wenn ein Deadlock auftritt.

    Dieses Ereignis kopiert die Ergebnisse der Systemprozedur "sa_report_deadlocks" in eine Tabelle und benachrichtigt den Administrator über den Deadlock.

    CREATE EVENT DeadlockNotification
    TYPE Deadlock
    HANDLER
    BEGIN
     INSERT INTO DeadlockDetails WITH AUTO NAME
     SELECT snapshotId, snapshotAt, waiter, who, what, object_id, record_id,
            owner, is_victim, rollback_operation_count
        FROM sa_report_deadlocks ();
     COMMIT;
     CALL xp_startmail ( mail_user ='George Smith',
                         mail_password ='mypwd' );
     CALL xp_sendmail( recipient='DBAdmin',
                       subject='Deadlock details added to the DeadlockDetails table.' );
     CALL xp_stopmail ( );
    END;
  3. Setzen Sie die Option "log_deadlocks" auf "On":

    SET OPTION PUBLIC.log_deadlocks = 'On';
  4. Aktivieren Sie die Protokollierung der zuletzt ausgeführten Anweisung:

    CALL sa_server_option( 'RememberLastStatement', 'YES' );
Siehe auch