回答:
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
私の知る限り、唯一の違いは、ストロミーが言ったように、影響の範囲です。テーブルに対するNOLOCKヒントとセッションに対するREAD UNCOMMITTED。
発生する可能性のある問題については、それはすべて一貫性についてです。気になる場合は、ダーティリードと呼ばれるものを取得する可能性があることに注意してください。これは、不正な情報で操作されている他のデータに影響を与える可能性があります。
私は個人的にはこれから問題を見たことはないと思いますが、それは私がnolockをどのように使用しているのかによります。使用しても問題ないシナリオがあることに注意してください。主に新しいデータをテーブルに追加しているが、データシナリオをチェックするために背後に来る別のプロセスがあるシナリオ。主要なフローには、読み取り中の行の戻りと更新は含まれていないため、おそらくそれで問題ありません。
また、最近では、マルチバージョン同時実行制御を検討する必要があると思います。私は彼らが2005年にそれを追加したと思います。これは、使用するデータベースのスナップショットを読者に提供することにより、ライターが読者をブロックするのを防ぐのに役立ちます。私はリンクを含めて、読者にさらなる調査を任せます:
テーブルごとにWITH(NOLOCK)を使用する必要があるため、すべてのFROMまたはJOIN句に書き込むのは面倒です。ただし、「ダーティ」リードと呼ばれる理由があります。したがって、いつ実行するかを本当に理解し、セッションスコープのデフォルトとして設定しないでください。どうして?
WITH(NOLOCK)を忘れてもプログラムに大きな影響を与えることはありませんが、不要なダーティーリードを実行すると、特定の状況で違いが生じることがあります。
そのため、選択した現在のデータが後でロールバックされる可能性があるため、正しくないことが許可されている場合は、WITH(NOLOCK)を使用します。これは主に、パフォーマンスを向上させたい場合に使用され、アプリケーションコンテキストの要件により、不整合なデータが表示されるリスクを負うことができます。ただし、WITH(NOLOCK)を使用するかどうかの決定について、あなたまたは担当者は長所と短所を比較検討する必要があります。
REPEATABLE READ
はSERIALIZABLE
、代わりに検討してください。SERIALIZABLE
本当に制限があり、ほとんど使用しないでください(たとえば、一部の重要な金融アプリケーションを除く)。