WAS+DB2でロックエスカレーションでまくり

DB2にはロックエスカレーションという、素敵な?仕組みがあり、行ロックが増えたとき、自動的にテーブルロックに切り替えてくれます。しかし、この動作が予期せぬデッドロックをひきおこすのが困ったものです。

先日、トラぶってた環境でも、この予期せぬロックエスカレーションに悩まされました。
ロックエスカレーションが発生していることは、DB2のdb2diag.logを見るとわかります(他の簡単な方法もありそうな気もします)。

[db2inst1@myserver db2dump]$ grep lock db2diag.log
ADM5502W The escalation of "1540" locks...

しかし、単にSELECTを実行しているだけで、WASもDB2も特に分離レベルの設定はしていない。
DB2のロックモードはデフォルトでCS(Sursor Stability カーソルのある行のみロック)らしいが、検索条件に一致したものにロックがかかっているように見える。

また、WASのデータソースから取得したコネクションから、分離レベルを取得してみると、2(Connection#TRANSACTION_READ_UNCOMMITTED)。このISO/JDBCの分離レベルとDB2の分離レベルの関連がどうもわからないが。。。

対処としてWASのアセンブリツールで分離レベルを明示的に設定すると、ロックエスカレーションがなくなった。うーん、ちゃんと設定しないとダメっちゅうことか。


参考:DB2の問題判別
http://www-6.ibm.com/jp/software/data/developer/pd/
http://www-6.ibm.com/jp/software/data/developer/pd/06_03.html#3
http://www-6.ibm.com/jp/software/data/developer/pd/06_05.html#5