アプリケーションプロファイリングのテストデータベース app_profiling.db を設定して、2 つのテーブルと 2 つのプロシージャを作成することにより、デッドロックを作成します。
前提条件
このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:デッドロックの診断
このチュートリアルは、テストデータベース app_profiling.db が作成されていることを前提としています。チュートリアル:アプリケーションプロファイリングのチュートリアル用のテストデータベースの作成を参照してください。
内容と備考
デッドロックは、複数のトランザクションが互いにブロックされている場合に発生します。たとえば、トランザクション A がテーブル B にアクセスする必要があるが、テーブル B はトランザクション B によってロックされ、トランザクション B はテーブル A にアクセスする必要があるが、テーブル A はトランザクション A によってロックされている場合などです。これは環状ブロッキングの競合が発生している状態です。
デッドロックが発生している状況は、SQLCODE -306 と -307 が返されることで分かります。デッドロックを解決するために、SQL Anywhere はデッドロックが作成された最後の文を自動的にロールバックします。文が絶え間なくロールバックされる場合は、パフォーマンス問題が発生しています。
Interactive SQL を起動します。[スタート] » [プログラム] » [SQL Anywhere 16] » [管理ツール] » [Sybase Central] をクリックします。
Interactive SQL で、次のように app_profiling.db に接続します。
[接続] ウィンドウで、テストデータベース app_profiling.db に接続するための情報を以下のフィールドに入力します。
[認証] フィールドで [データベース] を選択します。
[ユーザ ID] フィールドに DBA と入力します。
[パスワード] フィールドに sql と入力します。
[アクション] ドロップダウンリストで、[このコンピュータのデータベースを起動して接続] をクリックします。
[データベースファイル] フィールドに、C:\AppProfilingTutorial\app_profiling.db と入力します。
[開始行] フィールドに、dbeng16 -x tcpip と入力します。
[接続] をクリックします。
Interactive SQL で、次の 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) ); |
各テーブルに値を挿入します。
INSERT INTO "deadlock1"("val") VALUES('x'); INSERT INTO "deadlock2"("val") VALUES('x'); |
次の 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; |
データベースに加えた変更をコミットします。
COMMIT; |
Interactive SQL を閉じます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |