web-dev-qa-db-ja.com

NOLOCKまたはRead Uncommittedロック/ラッチ動作

私は、NOLOCKまたは読み取られたコミットされていない分離レベルが、ロック/ラッチの観点からどのように機能するかについて、多くのさまざまな見解を読みました。

SELECTをNOLOCKと一緒に使用する場合、またはコミットされていない読み取りの分離レベルで使用する場合、唯一のロックはスキーマ安定性ロックから取得されますか、またはクエリが行を処理するときに共有ロックがローリングベースで取得されますか? (明らかに、これらのロックはすぐに削除する必要があります)

ラッチはどうですか?変更中のメモリ内オブジェクトの参照は許可されていないと想定しているので、メモリ内のページはどのように処理されますか?

5
George.Palacios

READ UNCOMMITTED分離での読み取りは、Sch-Sのみを使用します。共有ロックは取得されません(いくつかの まれな例外 があります)。

lockingの下で読み取りますREAD COMMITTEDSロックを取得します。これは通常、クエリプロセッサが次の行に移動するとすぐに解放されます(ここにも いくつかの例外 があります)。

物理的な整合性を確保するために、ページは常に読み取りまたは書き込み中にラッチされ、通常は読み取り時に共有ラッチ、書き込み時に排他ラッチが行われます。詳細については、PASStvを介したBob Wardによる Inside SQL Server Latches を参照してください。

ロックは、SQL Serverが 分離レベル によって提供される保証を提供するために使用する実装の詳細です。

8
Paul White 9