SQL Server が Oracle DB よりデッドロックが発生しやすいと思われる件について

自分の中でうる覚えだった SQL ServerOracle DB よりデッドロックが発生しやすいと思われる件について、改めて調べてみたらかなり参考となるページが沢山見つかりました。


もう以下の2つのページに答えが書いてある感じですが、SQL Server のデフォルト設定だとトランザクション中での読み取り処理を行うとその行に対して共有ロックを実施するとのことで、この動作に起因して Oracle DB を利用する場合よりもデッドロックが発生しやすくなる理解で問題なさそうです。

detail.chiebukuro.yahoo.co.jp

bellsoft.jp


上記ページにも記載されていた MVCC(マルチバージョンコンカレントコントロール)を採用している DB は結構あるようで、SQL Server も 2005 のバージョン以降であれば READ_COMMITTED_SNAPSHOT オプションを ON に設定すると MVCC の動作となるようです。

ja.wikipedia.org


あと、以下のページでロックコストと同時実行性の関係が分かりやすく説明されておりました。恐らく、デフォルト設定の SQL Server では並列で大きな範囲でデータを更新しようとするとロックエスカレーションも発生することになり、よりデッドロックが発生しやすい状況になると思われます。

docs.microsoft.com


ちなみに、以下のページにあるように SQL Server Management Studio(SSMS)で自動コミットをオフにすると、SSMS 上で実行したクエリーだけではなく SQL Server エンジンそのものの挙動も変わるみたいです。そのように理解した理由として、以前、SSMS での自動コミットをオフにした状態で Blue Prism の設定画面で定義を変更したら応答が戻ってこなくなる事象に遭遇したためです。(イメージ的にはデッドロックが発生した感じでした) その後、SSMS の設定を自動コミット・オンへ戻すと Blue Prism 設定画面の動作も正常に戻りました。

www.backyrd.net


いやー、DB は奥が深いですね。