- PR -

DB2でのデッドロックについての質問

1
投稿者投稿内容
ふしぎ
会議室デビュー日: 2004/09/06
投稿数: 5
投稿日時: 2004-10-22 14:39
DB2で大量データを削除するプロセスを複数本同時に実行した場合にデッドロックが発生しています。
個々のプロセス間ではデータが重ならないようにしているので、本来デッドロックが起きないと思っていました。

また、DB2のログを確認してみましたが、テーブルロックが掛かっている様子もありません。

エラーログ:
 SQL0911N デッドロックまたはタイムアウトのため、現在の
 トランザクションがロールバックされました。理由コードは "2" です。
 SQLSTATE=40001

ちなみに、コミットはかなり頻繁に実行しています。

この様な現象についての原因と解決方法を調べています。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-10-22 14:49
unibon です。こんにちわ。

引用:

ふしぎさんの書き込み (2004-10-22 14:39) より:
エラーログ:
 SQL0911N デッドロックまたはタイムアウトのため、現在の
 トランザクションがロールバックされました。理由コードは "2" です。
 SQLSTATE=40001


#DB2 は使ったことがないのですが。

エラーコードで検索するといろいろヒットするようです。
http://www.google.co.jp/search?hl=ja&q=SQL0911N&lr=lang_ja
その中の、
http://www.atmarkit.co.jp/fdb/rensai/rdbmsarc04/rdbmsarc04_2.html
を見ると、デッドロックではなくタイムアウトなのではないでしょうか。
しかし、エラーメッセージが「デッドロックまたはタイムアウトのため」なのはなぜなんでしょう。どっちかひとつに絞り込めないのはなぜなの、と DB2 を問い詰めたくなります。
ふしぎ
会議室デビュー日: 2004/09/06
投稿数: 5
投稿日時: 2004-10-22 15:01
たしかに、SQLコードはデッドロックもタイムアウトも同じSQL0911Nですが、
理由コードが”2”となっているので、デッドロックしているということになります。
skulker
ベテラン
会議室デビュー日: 2004/06/08
投稿数: 67
投稿日時: 2004-10-22 17:32
それぞれのプログラムが更新するレコードが重なっていなくても、ロック競合は起こりますよ。DB2は読取りロックがかかりますし。
アクセスパスを見たらみんな表スキャンにでもなってるんじゃないですか?

まずはスナップショットやイベントモニターで何と何がデッドロックしてるか調べる事ですね。

# よく知りもしないものについてあれこれ物言うのもどうかと。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-10-22 19:41
引用:

skulkerさんの書き込み (2004-10-22 17:32) より:
# よく知りもしないものについてあれこれ物言うのもどうかと。


これは私の投稿に対するご指摘でしょうか?
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-10-22 23:31
引用:

DB2で大量データを削除するプロセスを複数本同時に実行した場合にデッドロックが発生しています。


そのプロセスというのは、すべて同じプログラムで処理手順も同じでしょうか。もし、すべてのプロセスが同じ処理手順(SQL発行がすべて同じ順序)で行っているにもかかわらず、デッドロックが発生しているとしたら、それは読み取りロック方式特有の「変換デッドロック」です。

回避方法は、skulker さんが言っているように、スキャンが発生しないようにすることですね。まあ、スキャンをなくしてもロック粒度が粗いと稀にデッドロックが発生しますので、デッドロック時のリトライも実装しておくとよりベターと思います。
はやぷ
会議室デビュー日: 2002/12/25
投稿数: 13
投稿日時: 2004-11-05 11:07
遅レスですが、
DB2にはロックエスカレーションというシステムがあり、
これが頻発するとタイムアウトにまでなってしまうことがあります。

ダンプしてみて、エスカレーションが発生している様であれば、
maxlocks及びlocklistの値を見直すという方法を解決方法として、
IBMさんは明示しているようです。
http://www.db2.jp/db2manual/ja_JP/index.htm?openup=admin/r0000268.htm

的外れだったらすみませんです。
1

スキルアップ/キャリアアップ(JOB@IT)