がんふぃーるど室長の不定期ブログ

ただいま助手と悪戦苦闘中!

目次

Blog 利用状況

ニュース


自己紹介

名前:がんふぃーるど
肩書:室長
種別:人間・男
資格一覧:
MCP 70-215 Installing, Configurating, and Administering Microsoft Windows 2000 Server
MCTS .NET Framework 2.0 - Distributed Applications
MCTS .NET Framework 2.0 - Web Applications

犬紹介


名前:なうら
肩書:助手
種別:犬・狆・メス
誕生日:2006/7/9
特技:鼻水飛ばし、甘噛、奇襲・急襲・強襲、そそう、お手、お座り、待て

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

行ロック以外に起因するデッドロック - Oracle

デッドロック

業務アプリを作成していると、必ずデッドロックというものは意識すると思います。リレーショナルDBを使用しているのであれば尚更だと思います。

基本的にはテーブルの更新順序に対する標準を作っておけば、起こることはありません。

 

少なくともOracleでは起こらないと思ってました。(;´Д`)

 

SQLServerだとロックエスカレーションによってページロックが発生してデッドロック!なんてことが稀にありますが、Oracleでもマルチプロセス、もしくはパラレルDMLによる大量更新時にITLの確保待ちによるデッドロックが発生する場合があります。(記述が紛らわしいですが、SQLServerのページロックとはまったく別物です)

 

ITL

ITLとは(Interested Transaction List)の略で、変更情報や行ロックに関する情報を管理しています。リストというぐらいなので、当然複数持っています。いくつかというと、初期状態ではCREATE文のINITRANSの個数分だけ確保され、必要に応じて最大MAXTRANSの個数まで拡張されます。

ただし、ブロックに空き容量がない場合は、拡張されません。(拡張できません)

 

リストの内容はセッションごとに管理されているので、ブロックの情報を2つのセッションで同時に操作する場合は2つ必要です。3つのセッションで同時に操作する場合は3つ必要となります。ただ、ITLは有限個しかないので、大量のセッションから同時に操作されたときに、ITLを拡張できない状態にあるとどうなるかというと、ITLの開放待ちになります。

…開放待ちになります…

 

デッドロック発生までの流れ

まずは、ブロックに対してITLの拡張ができないほど空きがなく、且つ、ITLが1つしかないものとします。その状態で

  1. セッションAがブロック1の情報を更新
  2. セッションBがブロック2の情報を更新
  3. セッションAがブロック2の情報を更新しようとしてITL開放待ち
  4. セッションBがブロック1の情報を更新しようとしてITL開放待ち

でデッドロックが発生します。ちなみに、セッションA、Bが更新する内容で行レベルのロックは一つも被っていませんが、まったくもって有り難くないORA-00060が発生しちゃいます。

 

調査方法

正直、分かりにくいです。普通にORA-00060が発生するので、一般的なデッドロックと判別がつきません。V$LOCKやV$LOCKED_OBJECTをリアルタイムに参照するのも難しいことから、唯一分かる情報としては「udump」に吐かれるトレース情報ぐらいです。

ここにはデッドロック時に「待ち」が発生していたセッション情報も含めて、大量の情報が記録されています。この中に「ITL Entry」に対するブロッキングが発生していた旨があった場合、ほぼ間違いなくITLデッドロックだと思います。

また、ITLデッドロックはテーブルだけでなく、インデックスに対しても発生するため、ロック対象のROW IDやOBJECT IDにインデックスのOBJECT IDが含まれていたら、ITLデッドロックなどのアプリデッドロック以外を疑ったほうがよいです。

 

解決方法

基本的にINITRANSに適切な値を設定することで回避できる問題なので、マルチプロセスでの大量更新・登録系って聞いた瞬間にINITRANSを適切に設定してやることで回避できます。ただし、INITRANSは1つ増やすごとに24バイトのブロックヘッダを消費するので、ご利用は計画的に。

 

参考文献

SHIFT The Oracle - Interested Transaction List

Oracle parallel DML: Deadlock Detected: ORA-00060

投稿日時 : 2008年7月16日 1:21

コメントを追加

No comments posted yet.
タイトル  
名前  
URL
コメント