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

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用 » トランザクションのブロックとデッドロック » トランザクションのブロック » デッドロック

 

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

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

詳細については、sa_conn_info システム・プロシージャを参照してください。

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' );
参照