Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
SQL Server でのデッドロック発生時の対応方法ついて説明します。
前提知識 †
基本的に、ロックのたすき掛けで発生しています。
このため、
で説明したように、SQL Serverのロッキングのメカニズムについて知っておく必要があります。
例えば、
- SQL Serverは
- 参照処理にもロック(共有ロック)をかける。
- スキャンにより広範囲にロックがかかる。
- ロック・エスカレーションにより広範囲にロックがかかる。
等と言った所でしょうか。
対応方法 †
設計上の問題 †
設計上の問題が無いか確認します。
- 更新ロックの役割
OracleとSQL Serverの更新ロックは、「更新データの消失」を防ぐ役割で使用される。
#「更新データの消失」とは参照したデータが、同一トランザクション中で更新されてしまう事。
SQL Serverの場合、「更新データの消失」の防止は、共有ロックのホールドでも事足りる。
このため、SQL Serverの更新ロックは「デッドロック」防止のためと言われる。
- デッドロックを回避のために検討すべきこと
1 : 同じ順序でオブジェクトにアクセスする(CRUD表などを利用)。
2 : トランザクション内でのユーザの対話をなくす。
3 : トランザクションを短くして、1つのバッチ内に収める。
4 : 業務に問題が無ければ、できるだけ低い分離レベルを使用する。
設定上の問題 †
ロックの確認 †
「SQL Server でのロック・タイムアウト」で説明した方法で、
ロックの状態を確認しつつ、デッドロックが発生していないかを確認します。
SQLプロファイラ †
SQLプロファイラを用いてデッドロックを確認する方法を以下に示します。
・・・
その他の対応 †
タイムアウトと同列に扱う †
レアケースであれば、ロック・タイムアウト、コマンド・タイムアウトと同様に
リトライ可能なエラー(業務続行可能なエラー)として設計しておくのも手です。
SQL Serverの問題 †
並列クエリ等、ロック以外の原因で
デッドロックが発生する可能性もあります。
原因によっては、パッチでFIXすることもあります。
この場合、エラー番号が異なるようです。
- サポート技術情報(Microsoft Knowledge Base)
参考情報 †