クライアントがデータを受信するのに長い時間がかかり、SQL Serverが待機する必要があるデータを受信したという確認をSQL Serverに送信する場合、この待機のため、SQL Serverはクライアントから確認を受信しない限り、クエリによって保持されたロックを解除しません。
これは正確ではなく、分離レベルに依存します。
デフォルトREAD COMMITTED
では、ステートメントの実行中はロックは保持されません。READ COMMITTED
ステートメントレベルの読み取り一貫性を提供しません。唯一の保証は、コミットされていないデータを読み取れないことです。行を読み取るために共有ロックが取得および保持され、その後解放されます。
LOBタイプがない場合。
潜在的に非常に大きいLOBタイプは、バッファリングできません。共有ロックは、ステートメントが完了するまで取得および保持する必要があり、基本的にでREPEATABLE READ
動作しREAD COMMITTED
ます。
高遅延ネットワークを介してMSSQLデータベースを1回呼び出すと、その遅延のためにテーブルロックが発生しますか?
レイテンシーはテーブルロックの原因ではありません。ただし、テーブルロックが取得された場合、レイテンシが長くなります。
私よりもこの仕組みをよく知っている人(@RemusRusanu)を引用するには:
実行が進むと、結果がクライアントプログラムに返されます。行が実行ツリーを「バブル」するので、通常、トップオペレーターはこれらの行をネットワークバッファーに書き込み、クライアントに送信します。結果は、最初に中間ストレージ(メモリまたはディスク)に作成されてからクライアントに返されず、代わりに(クエリの実行時に)作成時に返されます。もちろん、結果をクライアントに送り返すことは、ネットワークフロー制御プロトコルに従います。クライアントがアクティブに結果を消費していない場合(たとえば、SqlDataReader.Read()を呼び出すことにより)、最終的にフロー制御は送信側(実行中のクエリ)をブロックする必要があり、これにより、実行が中断されますクエリ。[ソース]
結果がSQL Serverが配信できるほど速く消費されない場合、クライアントまたはネットワークが原因である場合、ASYNC_NETWORK_IO
待機が累積することがわかります。繰り返しますが、これは取得されるロックには影響せず、保持されている期間にのみ影響します。
nolock
ヒントを指定しない限り、常にロックが発生します。待機時間は、ロックが保持される時間を決定するだけです。