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.
Siehe 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. Siehe Praktische Einführung: Deadlocks diagnostizieren.
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 ); |
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; |
Setzen Sie die Option "log_deadlocks" auf "On":
SET OPTION PUBLIC.log_deadlocks = 'On'; |
Aktivieren Sie die Protokollierung der zuletzt ausgeführten Anweisung:
CALL sa_server_option( 'RememberLastStatement', 'YES' ); |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |