DB2とデッドロック

Oracleと違って、DB2を使ったアプリはデッドロックが多発するんだけどね

この後Stingerで多くの局面的な解決方法が機能追加された
この2003年のころほど致命的にはならない

SQLステートメント

レジストリー変数

2009年OracleはSunを買収し、
MySQLを合わせると事実上のシェアは50%を越えてしまっただろう

1人当たりの経常利益は市場占有率の二乗に比例するのだそうだ
OracleとDB2の市場占有率は2:1から3:1にまで広がった
てことは、開発予算は4:1から9:1にまで広がってると推測

丸山先生のAmazonのDynamoの解説

データをいつでも書き込み可能
エラーや並行するする書き込みロックで、
書き込みを拒否されることはない
クラウドの時代になって、
ロックをかけてクラスタ全体を止めるなんて
今時ダサい

2009年4月 DB2 9.7から分離レベル"Currently Committed"が追加され
さすがにダーティリードは不要になった
これでPostgreSQLのMVCCくらいにまで改善
しかし、更新されコミットされてない行にはX-lockがかかるため
更新トランザクションは従来の仕様どおりに競合

Oracleの単発UPDATEは競合しても内部リスタートするため
DB2のようなX-Lock待ちにはならない

Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions
Thomas Kyte/CHAPTER7 Concurrency and Multi-Versioning

READ COMMITED分離レベルにおいて
UPDATEが競合し、更新対象のレコードが
別のトランザクションによって更新されていた場合
Oracleは内部でトランザクションをリスタートする

このリスタートで、UPDATEはいったんロールバックされ
その後、SELECT FOR UPDATEを使って更新対象レコードにロックをかける
ロックに成功すると再度UPDATEを実行する

トリガー(before update on 表 for each row)を仕掛けておくと
Oracleが内部リスタートする様子を観察できる

SERIALIZABLE分離レベルでは
ORA-08177: can't serialize access for this transaction
が発生する

あなたのブラウザは <APPLET> タグを完全に無視しました。

  • バグがデッドロックを起こした可能性
  • 再現テスト
  • DB2の設定値
  • ロックの調査方法
  • ロックのエスカレーション
  • デッドロックの公式見解
  • Jdbcによる更新系
  • デッドロック対応方針
  • MQT作成失敗
  • MQTよるパフォーマンス改善
  • N5SAN5TSA0001DAO.javaの修正方針
  • MQT化失敗
  • 遅いSQL
  • トランザクションタイムアウト
  • オプティミスティックロック
  • リソースの参照がはずれている場合
  • デッドロック時のリトライ機能
  • デッドロック対策の検討
  • デッドロック追跡
  • なぜU-ロックはデッドロックを回避するのか
  • Visual Explainの件
  • WebSphereのデッドロック解析
  • MQT検証
  • インデックスカバリング検証
  • イベントモニター
  • アクセスプラン解析とインデックス作成
  • 更新可能な分散キャッシュ

  • 参考文献

    2003/6-8,2009 ugya@lycos.com