DEADLOCKトレース

DEADLOCKコンポーネントを使用して、すべてのアプリケーションにおけるデッドロックの発生状況をトレースします。

表2-3に、DEADLOCKトレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。

表2-3 DEADLOCKトレース・レベル

レベル 出力

1

検出されたデッドロック・サイクル

4, 6

+ デッドロックの検出方法に関する詳細な情報の説明

この例では、myDSNデータベースに対して、DEADLOCKトレースをデフォルトのレベル1で実行するために、ttTraceMonを実行します。

myDSNへの2つの接続を作成します。最初の接続では、自動コミットは有効になっています。表testを作成して2行挿入します。次に、自動コミットを無効にして、表testx1=1行を更新します。自動コミットが無効なため、コミットされるまで表に行は挿入されません。トランザクションがコミットされる、またはロールバックされるまで、ロックは保持されます。

Command> create table test (x1 int unique, y1 int);
Command> insert into test values (1,1);
1 row inserted.
Command> insert into test values (2,2);
1 row inserted.
Command> autocommit 0;
Command> update test set y1=y1 where x1=1;
1 row updated.

myDSNへの2つ目の接続では、自動コミットを無効にします。表testx1=2行を更新します。

Command> autocommit 0;
Command> update test set y1=y1 where x1=2;1 row updated.

これから、お互いにロックされている行の各接続の更新文を実行してデッドロック状況を作成します。1つ目の接続は、x1=2の行に対して更新を実行します。

Command> update test set y1=y1 where x1=2;
 6003: Lock request denied because of time-out
Details: Tran 2.1 (pid 32750) wants Un lock on rowid BMUFVUAAAAaAAAAETk, 
table ME.TEST. But tran 3.2 (pid 32731) has it in Xn (request was Xn).
Holder SQL (update t1 set y1=y1 where x1=2)
The command failed.

2つ目の接続は、x1=1の行に対して更新を実行します。

Command> update test set y1=y1 where x1=1;
 6002: Lock request denied because of deadlock
Details: Tran 3.2 (pid 32731) wants Un lock on rowid BMUFVUAAAAaAAAADzk, 
table ME.TEST. But tran 2.1 (pid 32750) has it in Xn (request was Xn). 
Holder SQL (update t1 set y1=y1 where x1=1)
The command failed.

flushコマンドを使用してバッファを空にします。

% ttTraceMon myDSN
Trace monitor; empty line to exit
Trace> flush

トレース・バッファには、「1L」からわかるように、すべてのレベル1デッドロック・トレースを表示する次の情報が含まれています。

Trace> dump
09:50:26.444      13 DEADLOCK 1L 2036C   3484P edge 1: xid 3.2, cid 3, 
<Row BMUFVUAAAAaAAAADzk,0x8c5
74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=1'
09:50:26.455      14 DEADLOCK 1L 2036C   3484P edge 0: xid 2.1, cid 2, 
<Row BMUFVUAAAAaAAAAETk,0x8c5
74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=2'
09:50:26.455      15 DEADLOCK 1L 2036C   3484P Victim: xcb:3.2, 
SQL='update t1 set y1=y1 where x1=1'

さらに詳しい情報を確認する場合は、DEADLOCKトレースに高い値を設定します。たとえば、次では、ttTraceMonDEADLOCKトレースをレベル4に設定しています。

Trace > level deadlock 4