!!!DB2 ロッキングの問題 [DB2][Database] http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.pd.doc/pd/c0020764.htm?resultof=%22%e3%82%a8%e3%82%b9%e3%82%ab%e3%83%ac%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%22%20 発生する主なロッキング問題 !!ロック待機、タイムアウト *ロック要求は、タイムアウト期間を超えるか、またはデッドロックが発生するまで、待機アプリケーションに対して保留 *locktimeout データベース・パラメーター (秒単位) を使用して、ロックが使用可能になるのをアプリケーションが待機する期間の長さを構成 *タイムアウト期間を超えた場合、待機アプリケーションは戻りコード 68 を伴う SQL0911 エラー・メッセージを受け取りロールバック *locktimeout のデフォルト値は -1 で、これによりロック・タイムアウトは使用不可(永久に、またはロックが解除されるまで待機し続けます) !!エスカレーション !2 つの異なるシナリオで発生 +単一アプリケーションが、許可されるロック数を超えるロックを要求 +システム上でのデータベース・ロックの最大数を超えたため、アプリケーションがロック・エスカレーションをトリガー ""データベース・マネージャーが、表ロックを取得し、既存の行ロックを解除することによって、ロッキングに割り振られたメモリーを解放しようと試みます。望ましい効果は、追加のアプリケーションがより多くのロック・メモリーを使用できるようにする *locklist- 並行してデータベースに接続されているすべてのアプリケーションが保持する、すべてのロックのリストを保持するために割り振られるストレージの量 (4k ページの単位)。 *maxlocks- 単一アプリケーションが使用できるロック・リストの許容可能なパーセンテージ。 ![ロック・エスカレーション問題の解決|http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.trb.doc%2Fdoc%2Ft0055237.html&resultof=%22locklist%22%20] ::以下の情報を、管理通知ログから収集 *現在保持されているロックの数 *ロック・エスカレーションが完了する前に必要なロックの数 *現在保持されている非表ロックの数 *エスカレーションの一部として獲得される新しい表レベルのロック。通常、S または X ロックが獲得 *新しい表レベル・ロックの獲得に関連付けられた内部戻りコード ::管理通知ログの情報を使用し、エスカレーション問題の解決方法を決定 *maxlocks または locklist データベース構成パラメーター (あるいはその両方) を確認または調整 *RR、RS、CS、または UR などの、アプリケーションおよび SQL ステートメントが実行中の場合の分離レベルを考慮 *アプリケーションでのコミットの頻度を増やす *アプリケーションを変更し、LOCK TABLE ステートメントを使用して、表ロックを取得 !!デッドロック デッドロックが検出されると、デッドロック検出機能は、自動的にロールバックされ戻りコード 2 を伴う SQL0911 sql コードが出されるビクティム (犠牲となる作業単位) を選択します。ビクティムをロールバックすることにより、ロックの競合が除去され、他のアプリケーションは処理を続行 ""SQLコード -911 の場合、理由コード 2 ならデッドロック、68ならタイムアウト !ロックエスカレーション ::[突然ロックタイムアウトやデッドロックが多発|http://faq.db2watch.com/content/3/19/ja/%E7%AA%81%E7%84%B6%E3%83%AD%E3%83%83%E3%82%AF%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%82%84%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E5%8E%9F%E5%9B%A0%E3%81%AF%EF%BC%9F.html] まずはロック・エスカレーション を疑ってみましょう。DB2はデフォルトでは行ロックですが、ロック用のメモリー(LOCKLIST )が全体として不足したり、ロック用のメモリー(LOCKLIST)を1トランザクションで所定量(MAXLOCKS) 以上使うと、ロックの量を減らすために自動的に表ロックになります。表ロックになると並行度が下がり他の処理が待たされたりデッドロックが起きやすくなります。 *ログを確認 db2diag -g db=[DBNAME] *例 2008-04-XX-00.00.29.617870+540 E413519E589 LEVEL: Warning PID : 3707 TID : 47070471776608PROC : db2sysc INSTANCE: db2inst1 NODE : 000 DB : XXXDB APPHDL : 0-44235 APPID: *LOCAL.db2inst1.080424212730 AUTHID : DB2INST1 EDUID : 36147 EDUNAME: db2agent (XXXDB) FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:2 MESSAGE : ADM5500W DB2 is performing lock escalation. The total number of locks currently held is "212121", and the target number of locks to hold is "106060". !診断と解釈 *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.trb.doc/doc/c0054462.html?lang=ja *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.trb.doc/doc/c0020815.html?lang=ja