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 の使用法 » パフォーマンスの向上、診断、モニタリング » アプリケーションプロファイリングのチュートリアル » チュートリアル:デッドロックの診断

 

レッスン 1:データベースのセットアップ

デッドロックは、複数のトランザクションが互いにブロックされている場合に発生します。たとえば、トランザクション A がテーブル B にアクセスする必要があるが、テーブル B は トランザクション B によってロックされ、トランザクション B はテーブル A にアクセスする必要があるが、テーブル A はトランザクション A によってロックされている場合などです。これは環状ブロッキングの競合が発生している状態です。

デッドロックが発生している状況は、SQLCODE -306 と -307 が返されることで分かります。デッドロックを解決するために、SQL Anywhere はデッドロックが作成された最後の文を自動的にロールバックします。文が絶え間なくロールバックされる場合は、パフォーマンス問題が発生しています。

 ♦ デッドロックの生成
  1. このチュートリアルは、テストデータベース app_profiling.db が作成されていることを前提としています。

  2. 次の手順に従って app_profiling.db に接続します。

    1. Sybase Central の SQL Anywhere 12 プラグインで、[接続]  » [SQL Anywhere 12 に接続] をクリックします。

    2. [接続] ウィンドウで、テストデータベース app_profiling.db に接続するための情報を以下のフィールドに入力します。

      • [認証]   [データベース]

      • [ユーザー ID]   DBA

      • [パスワード]   sql

      • [アクション]   [このコンピューターのデータベースを開始]

      • [データベースファイル]   C:\AppProfilingTutorial\app_profiling.db

      • [開始行]   dbeng12 -x tcpip

    3. [接続] をクリックします。

  3. 左ウィンドウ枠で、app_profiling - DBA をクリックし、[ファイル]  » [Interactive SQL を開く] をクリックします。

    Interactive SQL が起動し、app_profiling.db データベースに接続します。

  4. Interactive SQL で、以下の手順を実行します。

    1. 次の SQL 文を実行して、2 つのテーブルを作成します。後で、これらのテーブルを使用して、デッドロックを発生させます。

      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) );
    2. 次の SQL 文を実行して、各テーブルに値を挿入します。

      INSERT INTO "deadlock1"("val") VALUES('x');
      INSERT INTO "deadlock2"("val") VALUES('x');
    3. 次の SQL 文を実行して、2 つのプロシージャーを作成します。後で、これらのプロシージャーを使用して、デッドロックを発生させます。



      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;
    4. 次の SQL 文を実行して、データベースへの変更をコミットします。

      COMMIT;
  5. Interactive SQL を閉じます。

  6. チュートリアルを続行するには、次のリンクをクリックします。レッスン 2:デッドロックの生成と情報の取得

 参照