WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


118

誰かが私WITH (NOLOCK)とは対照的に私がいつ使用すべきかについていくつかのガイダンスをくれますかSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

それぞれの長所/短所は何ですか?片方をもう片方とは対照的に使用した場合、意図しない結果はありますか?

回答:


105

彼らは同じものです。このset transaction isolation levelステートメントを使用すると、接続内のすべてのテーブルに適用されるため、nolock1つまたは2つのテーブルでのみ使用する場合は、それを使用します。それ以外の場合は、もう一方を使用してください。

どちらもダーティーリードになります。それで大丈夫なら、それを使ってください。ダーティリードを使用できない場合は、代わりに検討snapshotまたはserializableヒントします。


ファントムデータを気にしない場合REPEATABLE READSERIALIZABLE、代わりに検討してください。SERIALIZABLE本当に制限があり、ほとんど使用しないでください(たとえば、一部の重要な金融アプリケーションを除く)。
クリプトス

25

WITH(NOLOCK)は、テーブルレベルのヒントです。トランザクション分離レベルをREAD_UNCOMMITTEDに設定すると、接続に影響します。違いはスコープの面です。以下のSQL ServerドキュメントのREADUNCOMMITTEDおよびNOLOCKを参照してください。

http://technet.microsoft.com/en-us/library/ms187373.aspx

トランザクション分離レベルの場合:http : //technet.microsoft.com/en-us/library/ms173763.aspx


10
  • NOLOCKはテーブル(またはビューなど)に対してローカルです
  • READ UNCOMMITTEDはセッション/接続ごとです

ガイドラインについては... StackOverflowと電気インターウェブからのランダム検索...


最後のリンク「NOLOCKを使用することが悪い理由」はもう存在しません。
サンガム2015年

1
電気インターウェブは貴重です。私の日を晴らしてくれてありがとう。
JJS

9

私の知る限り、唯一の違いは、ストロミーが言ったように、影響の範囲です。テーブルに対するNOLOCKヒントとセッションに対するREAD UNCOMMITTED。

発生する可能性のある問題については、それはすべて一貫性についてです。気になる場合は、ダーティリードと呼ばれるものを取得する可能性があることに注意してください。これは、不正な情報で操作されている他のデータに影響を与える可能性があります。

私は個人的にはこれから問題を見たことはないと思いますが、それは私がnolockをどのように使用しているのかによります。使用しても問題ないシナリオがあることに注意してください。主に新しいデータをテーブルに追加しているが、データシナリオをチェックするために背後に来る別のプロセスがあるシナリオ。主要なフローには、読み取り中の行の戻りと更新は含まれていないため、おそらくそれで問題ありません。

また、最近では、マルチバージョン同時実行制御を検討する必要があると思います。私は彼らが2005年にそれを追加したと思います。これは、使用するデータベースのスナップショットを読者に提供することにより、ライターが読者をブロックするのを防ぐのに役立ちます。私はリンクを含めて、読者にさらなる調査を任せます:

MVCC

データベース分離レベル


+1私はREAD_UNCOMMITTEDの "should you"の側面には触れていませんでしたが、Seanはこれをうまくカバーしています。SQLServerで同じ行を2回読み取ることができる場合もあります(ページ分割のため)
Anon246

6

ビューでコミットされていないトランザクション分離レベルの設定を使用することはできません(実際には1つのスクリプトしか使用できません)。そのため、ダーティ行を含める必要がある場合は(nolock)を使用する必要があります。


4

テーブルごとにWITH(NOLOCK)を使用する必要があるため、すべてのFROMまたはJOIN句に書き込むのは面倒です。ただし、「ダーティ」リードと呼ばれる理由があります。したがって、いつ実行するかを本当に理解し、セッションスコープのデフォルトとして設定しないでください。どうして?

WITH(NOLOCK)を忘れてもプログラムに大きな影響を与えることはありませんが、不要なダーティーリードを実行すると、特定の状況で違いが生じることがあります。

そのため、選択した現在のデータが後でロールバックされる可能性があるため、正しくないことが許可されている場合は、WITH(NOLOCK)を使用します。これは主に、パフォーマンスを向上させたい場合に使用され、アプリケーションコンテキストの要件により、不整合なデータが表示されるリスクを負うことができます。ただし、WITH(NOLOCK)を使用するかどうかの決定について、あなたまたは担当者は長所と短所を比較検討する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.