- - PR -
DB2でのデッドロックについての質問
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-22 14:39
DB2で大量データを削除するプロセスを複数本同時に実行した場合にデッドロックが発生しています。
個々のプロセス間ではデータが重ならないようにしているので、本来デッドロックが起きないと思っていました。 また、DB2のログを確認してみましたが、テーブルロックが掛かっている様子もありません。 エラーログ: SQL0911N デッドロックまたはタイムアウトのため、現在の トランザクションがロールバックされました。理由コードは "2" です。 SQLSTATE=40001 ちなみに、コミットはかなり頻繁に実行しています。 この様な現象についての原因と解決方法を調べています。 | ||||
|
投稿日時: 2004-10-22 14:49
unibon です。こんにちわ。
#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-10-22 15:01
たしかに、SQLコードはデッドロックもタイムアウトも同じSQL0911Nですが、
理由コードが”2”となっているので、デッドロックしているということになります。 | ||||
|
投稿日時: 2004-10-22 17:32
それぞれのプログラムが更新するレコードが重なっていなくても、ロック競合は起こりますよ。DB2は読取りロックがかかりますし。
アクセスパスを見たらみんな表スキャンにでもなってるんじゃないですか? まずはスナップショットやイベントモニターで何と何がデッドロックしてるか調べる事ですね。 # よく知りもしないものについてあれこれ物言うのもどうかと。 | ||||
|
投稿日時: 2004-10-22 19:41
これは私の投稿に対するご指摘でしょうか? | ||||
|
投稿日時: 2004-10-22 23:31
そのプロセスというのは、すべて同じプログラムで処理手順も同じでしょうか。もし、すべてのプロセスが同じ処理手順(SQL発行がすべて同じ順序)で行っているにもかかわらず、デッドロックが発生しているとしたら、それは読み取りロック方式特有の「変換デッドロック」です。 回避方法は、skulker さんが言っているように、スキャンが発生しないようにすることですね。まあ、スキャンをなくしてもロック粒度が粗いと稀にデッドロックが発生しますので、デッドロック時のリトライも実装しておくとよりベターと思います。 | ||||
|
投稿日時: 2004-11-05 11:07
遅レスですが、
DB2にはロックエスカレーションというシステムがあり、 これが頻発するとタイムアウトにまでなってしまうことがあります。 ダンプしてみて、エスカレーションが発生している様であれば、 maxlocks及びlocklistの値を見直すという方法を解決方法として、 IBMさんは明示しているようです。 http://www.db2.jp/db2manual/ja_JP/index.htm?openup=admin/r0000268.htm 的外れだったらすみませんです。 |
1