SQL Serverでのブロッキングに関する情報を見つけようとしましたが、それが何であり、どのように発生するのかについての簡潔な説明が見つかりませんでした。教えて頂けますか?
アナログ
時々それはコンピュータから離れて類推を使用するのに役立ちます。
ボールと2人の子供がいるとします。一度に1人の子供だけがボールを持つことができます。しかし、片方の子供がボールを手に入れ、彼が気を散らしている(たとえばテレビを見ている)ためにボールを離さない場合、もう片方の子供はボールで遊ぶことができません。
他の子はそのリソースからブロックされています。
たとえば、これをテレビと比較すると、複数の子供がいつでもテレビを見ることができます。
ロック
データベースの世界に移ると、リソースを使用するにはさまざまな方法があることがわかります(上記の2つの例のように)。 「読み取り」または「書き込み」を実行できます。
データを読みたいとき、他の人がデータを読むことができないという理由はありません。テレビを見ている2人の人と同じです。ただし、データを書き込みたい場合は、他の誰もそれを見ていないことを確認する必要があります。私たちが書いている間に彼らがそれを読んでいる場合、彼らは「ダーティ」な読み取りを取得します。 (つまり、データが部分的に書き出され、無効になります。)
これらのダーティリードが発生しないことを保証するために、2つの主要なタイプのロック、読み取りロックと排他ロックがあります。
読み取りロック
複数の異なる接続で、同じデータソースからいつでも読み取ることができます。ただし、データの読み取り中に誰もそのデータを変更しないようにするために、読み取りロックを解除します。
接続がデータの一部に読み取りロックを持つと、他のすべての接続は、データがwriteできるようになる前に、読み取りロックが解放されるまで待機する必要があります。ただし、同じデータに対して独自の読み取りロックを解除することもできます。
排他ロック
接続でデータの一部を更新/挿入/削除する場合は、排他ロックを解除する必要があります。これにより、他の接続でもデータのロックが解除されることを防ぎます(その接続に対してロックを排他的にします)。
接続がデータに対して排他ロックを持っている場合、他の接続はデータから読み取ることができません。これにより、書き込み中に誰もデータを読み取れないようにして、ダーティリードを防止できます。
ブロッキング
「ブロッキング」とは、別の接続がリソースに読み書きしたいときに、ある接続がリソースのロックを保持していることを意味する用語です。それは必ずしも所有者接続がそれを解放しないことを必ずしも意味するのではなく、それが現在それを保持しているというだけです。
これを子供がボールを持っている場合と比較してください。ボールを保持している子供は、他のすべての子供がボールを保持するのを妨げています。
デッドロック
私はあなたがこれを尋ねなかったのを知っています、しかしそれはデッドロックに到達するためのもう一つのステップです(そしてそれはブロッキングに非常に直接関連しています)。
デッドロックは、それぞれにロックが設定されている2つの接続があるが、お互いにリソースが必要な場合に発生する可能性があります。このシナリオでは、2人の子供がそれぞれにボールを持っているが、もう1人のボールが欲しいと思っています。
子供のように、これらのつながりはまったく共有する気がありません。各接続は、続行するために両方のリソースにアクセスする必要があります。ただし、それらは永続的なブロッキングの状態にあります。この状態では、親(DBMS)が入って敗者を選択し、子(接続)の1つが両方のリソースにアクセスできるようにする必要があります。
その「勝った」接続が完了すると、リソースが解放され、もう一方の(「負けた」)接続が両方のリソースに到達するために再試行できます。
したがって、デッドロックの概念は、互いにブロックしている2つのリソースがある場合です。
ここ 、SQL Serverが提供する必要のあるすべての種類のロックと、ブロッキング/デッドロックを引き起こす可能性のあるさまざまなリソースの詳細を読むことができます。記事は古いですが、SQL Server 2000から2008 R2までまだ適用されます。 (それ以降のバージョンのSQL Serverには、さらにいくつかの種類のロックが追加されていますが、それが出発点になります。)
リチャードによる素晴らしい説明ですが、公式ドキュメントへのリンクを追加したかっただけです。これらのトピックはSQL Server 2000用に作成されましたが、概念の多くは現在も同じです。
編集-いくつかの追加:
ブロッキングビデオと戦う5つの方法 -ケンドラリトルの非常に新鮮なビデオ(本日公開)
探偵としてのDBA:ロックとブロッキングのトラブルシューティング -by Rodney Landrum
SQLプロファイラーでブロッキングの問題を特定する方法 -Brad McGehee著
3人とも非常によく知られているSQL Serverの作成者またはMVPです。