LOCKトレース

LOCKコンポーネントを使用すると、アプリケーションのロック動作をトレースして、デッドロックまたはロックの待機による問題を検出できます。LOCKトレースは大量の情報を生成するので、適切なトレース・レベルを選択することが重要です。たとえば、レベル3では、ごく一般的なイベントについてもトレースが作成されるため、大量のトレースが発生します。また、トレース自体が読みにくくなることもあります。必要な情報が見つからない場合は、TimesTenカスタマ・サポートに連絡してください。

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

表2-4 LOCKトレース・レベル

レベル 出力

1

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

2

+ なんらかの理由によるロック付与の失敗

3

+ ロックの待機(付与の有無に依存しない)

4

+ すべてのロックの付与/解除、ルーチンのコール、デッドロック検出のメカニズム

6

+ サイクルにおける各ステップ

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

myDSNへの2つの接続を作成します。最初の接続では、自動コミットを有効にします。表testを作成して3行挿入します。表testを使用してマテリアライズド・ビューを作成します。

レベル4でトレースを有効にし、flushコマンドを使用してバッファを空にします。

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

myDSNへの2つ目の接続では、自動コミットを無効にします。表testに1行挿入します。自動コミットが無効なため、コミットされるまで表に行は挿入されません。トランザクションがコミットされる、またはロールバックされるまで、ロックは保持されます。

dumpコマンドを使用してトレース・バッファの内容を表示すると、トレース・バッファにレコードがないことがわかります。

Trace> dump
0 records dumped

最初の接続からマテリアライズド・ビューを削除してみます。コミットまたはロールバックされていないトランザクションがあるため、ビューは削除されません。

Command> drop materialized view v;
 6003: Lock request denied because of time-out
Details: Tran 3.71 (pid 24524) wants Sn lock on table TTUSER.TEST. But tran 1.42 
(pid 24263) has it in IXn (request was IXn). Holder SQL (insert into test 
values (100);)
The command failed.

トレース・バッファには次の情報が含まれます。

Trace> dump
20:09:04.789  174759 LOCK     3L    3C  24524P ENQ: xcb:00003 <Tbl 0x9b894,0x0>
0+Sn=>SL activity 0 Sn cnt=0; Holder xcb:00001 IXn
20:09:04.789  174760 LOCK     3L    3C  24524P Connection 3 scheduled for sleep
20:09:04.789  174761 LOCK     3L    3C  24524P Connection 3 sleeping
20:09:14.871  174762 LOCK     3L 2047C  24237P Connection 3 timed out
20:09:14.871  174763 LOCK     3L 2047C  24237P Connection 3 woken up
20:09:14.871  174764 LOCK     3L    3C  24524P Connection 3 awake
20:09:14.871  174765 LOCK     2L    3C  24524P ENQ: xcb:00003 <Tbl 0x9b894,0x0>
0+Sn=>TM activity 0 Sn cnt=1; Holder xcb:00001 IXn
7 records dumped

トレースが終了したら、LOCKトレースをデフォルトの設定(0)に戻し、ttTraceMonを終了します。

Trace > level lock 0
Trace > {press ENTER – blank line}