1. ホーム
  2. sql-server

[解決済み] SQL Server の SELECT クエリにおける LOCKS を理解する

2023-04-09 21:28:32

質問

を使用する利点は何でしょうか? SELECT WITH (NOLOCK) を使用する利点は何なのでしょうか? SELECT クエリである場合。

SQL Server ではどのように処理されるのでしょうか?SQL Server では SELECT クエリは別の SELECT クエリ?

私はSQL Server 2012を使用しており、Linq-to-SQLの DataContext .

(編集)

性能について :

  • 2番目の SELECT を待たねばならないのでしょうか? SELECT が終了するまで待つ必要があります。 SELECT ?
  • 対して SELECT WITH (NOLOCK) ?

どのように解決するのですか?

A SELECT は、SQL Server では 共有ロック をテーブルの行に置き、2番目の SELECT も共有ロックを必要とし、これらは互いに互換性があります。

だからダメなんです。 SELECT をブロックすることはできません。 SELECT .

何が WITH (NOLOCK) クエリヒントが使用されるのは、(別の接続によって)挿入される途中の、まだコミットされていないデータを読み取ることができるようにするためです。

このクエリヒントがない場合 SELECT がテーブルの読み込みをブロックしている可能性があります。 INSERT (または UPDATE を配置するステートメントです。 排他的 を配置し、その操作のトランザクションがコミット(またはロールバック)されるまで、行(またはテーブル全体)を排他的にロックします。

の問題点は WITH (NOLOCK) のヒントの問題点は、最終的に挿入されないデータ行を読み込んでしまうことです(もし INSERT トランザクションがロールバックされた場合) - そのため、例えば、レポートには実際にデータベースにコミットされたことのないデータが表示されるかもしれないのです。

もう一つ、便利なクエリヒントがあります。 WITH (READPAST) . これは SELECT コマンドは、読み込もうとした行のうち、排他的にロックされている行をスキップするように指示します。このコマンドは SELECT はブロックしませんし、コミットされていない "dirty" データを読み取ることもありません。