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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » トランザクションと独立性レベル » トランザクションのブロックとデッドロック » トランザクションのブロック » デッドロック

 

ブロックされているユーザーの判別

sa_conn_info システムプロシージャーを使用して、どの接続がどの接続でブロックされているかを判別できます。このプロシージャーは、接続ごとに 1 つのローで構成される結果セットを返します。結果セットのカラムの 1 つには、接続がブロックされているかどうか、およびブロックされている場合は、どの接続でブロックされているかがリストされます。

Deadlock イベントを使用して、デッドロックの発生時にアクションを実行できます。イベントハンドラーでは、sa_report_deadlocks プロシージャーを使用して、デッドロックが発生するに至った状況に関する情報を取得できます。データベースサーバーからデッドロックの詳細を取り出すには、log_deadlocks オプションを使用して RememberLastStatement 機能を有効にします。

次の手順では、デッドロックが発生した場合にその情報を取得するために使用できるテーブルとシステムイベントの設定方法を示します。アプリケーションで頻繁にデッドロックが発生する場合は、アプリケーションプロファイリングを使用するとデッドロックの原因の究明に役立ちます。

 ♦ デッドロックの発生時のアクションの実行
  1. 次のように、sa_report_deadlocks システムプロシージャーが返すデータを格納するテーブルを作成します。



    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. デッドロックが発生したときに起動するイベントを作成します。

    このイベントにより、sa_report_deadlocks システムプロシージャーの結果がテーブルにコピーされ、管理者にデッドロックが通知されます。



    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. log_deadlocks オプションを On に設定します。

    SET OPTION PUBLIC.log_deadlocks = 'On';
  4. 最後に実行された文のロギングを有効にします。

    CALL sa_server_option( 'RememberLastStatement', 'YES' );
 参照