マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

SQL Server でのデッドロック発生時の対応方法ついて説明します。

前提知識

基本的に、ロックのたすき掛けで発生しています。

このため、

で説明したように、SQL Serverのロッキングのメカニズムについて知っておく必要があります。

例えば、SQL Serverは、

  • 参照処理にもロック(共有ロック)をかける。
  • スキャンにより広範囲にロックがかかる。
  • ロック・エスカレーションにより広範囲にロックがかかる。

等と言った所でしょうか。

分析方法

ロックの確認

SQL Server でのロック・タイムアウト」で説明した方法で、
ロックの状態を確認しつつ、デッドロックが発生していないかを確認します。

SQLプロファイラ

SQLプロファイラを用いてデッドロックを確認する方法

対応方法

アプリ側の設計上の問題

ロック法で実装されたRDBMSを利用するアプリケーションとしての設計上の問題が無いかを確認します。

更新ロックの活用

OracleとSQL Serverの更新ロックは、「更新データの消失」を防ぐ役割で使用される。
#「更新データの消失」とは参照したデータが、同一トランザクション中で更新されてしまう事。
SQL Serverの場合、「更新データの消失」の防止は、共有ロックのホールドでも事足りる。
このため、SQL Serverの更新ロックは「デッドロック」防止のためと言われる。

デッドロックの回避

更新ロックの活用以外にも、デッドロックを回避のために検討すべきことがあります。

  1. 同じ順序でオブジェクトにアクセスする(CRUD表などを利用)。
  2. トランザクション内でのユーザの対話をなくす。
  3. トランザクションを短くして、1つのバッチ内に収める。
  4. 業務に問題が無ければ、できるだけ低い分離レベルを使用する。

DBMSの機能上の問題

ロック法で実装されたRDBMSの機能を問題と考える場合、以下のような対策もあります。

エスカレーションの抑止

ロックのエスカレーションの抑止をする。
SQL Server のロックのエスカレーション

多バージョン法への切替

多バージョン法へ切り替える。
DBMSのロック・分離戦略と同時実行制御

その他の対応

タイムアウトと同列に扱う

レアケースであれば、ロック・タイムアウト、コマンド・タイムアウトと同様に
リトライ可能なエラー(業務続行可能なエラー)として設計しておくのも手です。

SQL Serverの問題

並列クエリ等、ロック以外の原因で
デッドロックが発生する可能性もあります。
原因によっては、パッチでFIXすることもあります。

この場合、エラー番号が異なるようです。

  • 通常:1205
  • 並列クエリ:8650
  • サポート技術情報(Microsoft Knowledge Base)

参考

  • [SQLServer]デッドロックを発生させてログを拾ってみる 大都会で働く新人SEの日記
    http://t-wata.com/?p=221

Tags: :データアクセス, :SQL Server, :障害対応, :性能, :デバッグ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-22 (月) 14:33:01 (333d)