[DB][DB2] deadlock

■原因
WASのデータソースのDB2の分離レベルが、
[CS]でなく[RS]になっている。

RS
取り出した行の読み取りロックがCOMMITされるまで続く。
→同じ行をSELECTし続けてUPDATEする処理を2つ並列に流すとデッドロックになる。

WASのデータソースの分離レベル
デフォルトが[RS]である。
WASのデフォルト設定の方が、DB2のデフォルト設定([CS])より優先される!

*分離レベル
CSがお勧め。


□策1
行の読み取りロックをキープしておいて、
UPDATE/DELETE処理なら、SELECTにFOR UPDATE句を追加する。

□策2
行の読み取りロックをキープしておいて、
UPDATE/DELETE処理なら、SELECTに
WITH RS USE AND KEEP UPDATE LOCKS句
を追加する。
→明示的なロックモードを指定できる。
→JOINを含むSQLにも使用できる。

□策3
別の行の読み取りロックを保持したくなければ、
SELECTにWITH CS句を追加する。

□策4
JDBCのCONNECTIONオブジェクトに
con.setTransactionIsolation(TRANSACTION_READ_COMMITTED)や
con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)で分離レベルをRSより弱くする。

□策5
WASのアプリ資源のdeploymentで、
分離レベルをCSUR等、RSより弱いレベルにする。

□策6
LOCK ACOIDANCE系のレジストリ変数を検討する。
DB2_EVALUANCOMMITTED
DB2_SKIPPDELETED
DB2_SKIPINSERTED
とか

□策7
ロックタイムアウトを設定する。
デフォルトでlocktimeout=-1(無限に待つ)になっている。


■分離レベル変更方法
*SQLに埋め込む
*connectionオブジェクトに設定する
*デプロイ時にリソース参照で設定する
*データソースのカスタムプロパティ(webSphereDefaultIsolationLevel)で設定する

ref:
http://db2forum.jp/viewtopic.php?t=1996
http://www-01.ibm.com/support/docview.wss?uid=std327fede7ab1fcd7ab4925732b0007cc2c

tag : DB2 WAS RS CS UR WITH TRANSACTION_READ_COMMITTED TRANSACTION_READ_UNCOMMITTED DB2_EVALUANCOMMITTED DB2_SKIPPDELETED

2009-04-09 23:10 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud