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