ブロッキングとはどのようなものですか?


20

SQL Serverのブロックに関する情報を見つけようとしましたが、それが何であり、どのように発生するかについての簡潔な説明を見つけることができませんでした。教えてください。

回答:


23

類推

コンピューターから類推を使用すると役立つ場合があります。

ボールと2人の子供がいるとしましょう。一度にボールを保持できるのは1人の子供のみです。ただし、子供の1人がボールを取得し、気が散って(たとえば、テレビを見ているなど)離さないと、他の子供はボールで遊ぶことができません。

他の子はそのリソースからブロックされます。

たとえば、これをテレビと比較すると、複数の子供がいつでもテレビを見ることができます。

ロック

データベースの世界に移行すると、リソースを使用するさまざまな方法があることがわかります(上記の2つの例のように)。「読み取り」または「書き込み」を実行できます。

データを読みたいとき、他の人がデータを読むことができない理由はありません。テレビを見ている2人のように。ただし、データを書きたい場合は、他の人がそれを見ていないことを確認する必要があります。私たちがそれを書いている間に彼らがそれを読んでいるなら、彼らは「汚い」読み取りを取得します。(つまり、データが部分的に書き出されていることがわかりますが、これは無効になります。)

これらのダーティリードが決して発生しないようにするために、2つの主要なタイプのロック、読み取りロックと排他ロックがあります。

読み取りロック

いつでも同じデータソースから複数の異なる接続を読み取ることができます。ただし、読み取り中に誰もそのデータを変更しないように、読み取りロックを解除します。

接続がデータの一部に対して読み取りロックを取得すると、他のすべての接続は、データを書き込む前に読み取りロックが解放されるまで待機する必要があります。ただし、同じデータに対して独自の読み取りロックを取得することもできます。

排他ロック

接続がデータの一部を更新/挿入/削除する場合、排他ロックを解除する必要があります。これにより、他の接続もデータのロックを取得できなくなります(ロックはその接続専用になります)。

接続にデータの排他ロックがある場合、他の接続はデータから読み取ることができません。これにより、書き込み中はだれもデータを読み取れないようにすることで、ダーティリードの防止に役立ちます。

ブロッキング

「ブロック」とは、ある接続がリソースの読み取りまたは書き込みを行うときに、ある接続がリソースのロックを保持していることを意味する用語です。所有者接続が解放しないことを必ずしも意味するものではなく、現在保持しているだけです。

これを、ボールを持った子供の場合と比較してください。ボールを保持している子供は、他のすべての子供がボールを保持するのをブロックしています。

デッドロック

あなたはこれを聞かなかったことは知っていますが、それはデッドロックにたどり着くためのもう一つのステップにすぎません(そしてそれはブロッキングに非常に直接関係しています)。

デッドロックは、それぞれがロックを持っている2つの接続がある場合に発生する可能性がありますが、お互いのリソースが必要です。このシナリオでは、それぞれがボールを持っているが、相手のボールが欲しいという2人の子供のようです。

子供のように、これらの接続はまったく共有するつもりはありません。続行するには、各接続が両方のリソースにアクセスする必要があります。ただし、それらは永続的なブロッキングの状態です。この状態では、子(接続)の1つが両方のリソースにアクセスできるように、親(DBMS)が入り、敗者を選択する必要があります。

その「勝つ」接続が完了すると、リソースを解放し、他の(「失う」)接続が再び両方のリソースに到達することを試みることができます。

したがって、デッドロックの概念は、相互にブロックしている2つのリソースがあることです。


ここでは、SQL Serverが提供するロックの種類と、ブロッキング/デッドロックを引き起こす可能性のあるさまざまなリソースについて詳しく説明しています。この記事は古いですが、SQL Server 2000から2008 R2に適用されます。(SQL Serverの以降のバージョンにはさらにいくつかの種類のロックが追加されていますが、それが出発点になります。)


1
@Richard、デッドロックが発生した場合に言及したように、DBMSが入って敗者を選択します。これはDBMSによって自動的に行われますか?または、設計が不十分なシステム(デッドロックが頻繁に発生するシステム)は、人がDBMSを開始するまで停止しますか?
CenterOrbit

2
SQL Serverの場合、これは自動的に行われます(データベースがデッドロックを検出できる場合)。たとえば、実際にライブロックである場合、検出に問題がある可能性があります
リチャード

優れた、非常に徹底的な答えリチャード。ライブロックに関するもう1つのポイント(実際にデッドロックと比較または関連するべきではない、その単純な古いブロッキング)...
マークストーリースミス

5

リチャードによる素晴らしい説明ですが、公式ドキュメントへのリンクを追加したかっただけです。これらのトピックはSQL Server 2000向けに作成されましたが、概念の多くは現在も同じままです。

ブロッキングの理解と回避

SQL Serverのロックについて

編集-いくつかの追加:

3人はすべて、非常によく知られたSQL Serverの作成者またはMVPです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.