「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
SQL Server でのデッドロック発生時の対応方法ついて説明します。
基本的に、ロックのたすき掛けで発生しています。
このため、
で説明したように、SQL Serverのロッキングのメカニズムについて知っておく必要があります。
例えば、SQL Serverは、
等と言った所でしょうか。
「SQL Server でのロック・タイムアウト」で説明した方法で、
ロックの状態を確認しつつ、デッドロックが発生していないかを確認します。
ロック法で実装されたRDBMSを利用するアプリケーションとしての設計上の問題が無いかを確認します。
OracleとSQL Serverの更新ロックは、「更新データの消失」を防ぐ役割で使用される。
#「更新データの消失」とは参照したデータが、同一トランザクション中で更新されてしまう事。
SQL Serverの場合、「更新データの消失」の防止は、共有ロックのホールドでも事足りる。
このため、SQL Serverの更新ロックは「デッドロック」防止のためと言われる。
更新ロックの活用以外にも、デッドロックを回避のために検討すべきことがあります。
ロック法で実装されたRDBMSの機能を問題と考える場合、以下のような対策もあります。
ロックのエスカレーションの抑止をする。
SQL Server のロックのエスカレーション
多バージョン法へ切り替える。
DBMSのロック・分離戦略と同時実行制御
レアケースであれば、ロック・タイムアウト、コマンド・タイムアウトと同様に
リトライ可能なエラー(業務続行可能なエラー)として設計しておくのも手です。
並列クエリ等、ロック以外の原因で
デッドロックが発生する可能性もあります。
原因によっては、パッチでFIXすることもあります。
この場合、エラー番号が異なるようです。
Tags: :データアクセス, :SQL Server, :障害対応, :性能, :デバッグ