SELECT SQLServerでは共有ロックを配置します テーブルの行-および2番目のSELECT また、共有ロックが必要であり、それらは相互に互換性があります。
したがって、1つのSELECT 別のSELECTをブロックできません 。
WITH (NOLOCK) クエリヒントは、(別の接続によって)挿入されている途中で、まだコミットされていないデータを読み取れるようにするために使用されます。
そのクエリヒントがない場合、SELECT 進行中のINSERTによってテーブルの読み取りがブロックされる可能性があります (またはUPDATE )排他的を配置するステートメント その操作のトランザクションがコミットされる(またはロールバックされる)まで、行(または場合によってはテーブル全体)をロックします。
WITH (NOLOCK)の問題 ヒントは次のとおりです。最後に、まったく挿入されないデータ行を読み取っている可能性があります(INSERTの場合) トランザクションはロールバックされます)-つまり、レポートには、データベースに実際にコミットされたことのないデータが表示される場合があります。
役立つ可能性のある別のクエリヒントがあります-WITH (READPAST) 。これはSELECTに指示します 読み込もうとし、排他的にロックされている行をスキップするコマンド。 SELECT ブロックせず、「ダーティ」なコミットされていないデータを読み取りませんが、一部の行をスキップする可能性があります。テーブル内のすべての行を表示するわけではありません。