ダーティ リードを使用する必要がある、または使用しない理由:
set transaction isolation level read uncommitted
SQLサーバーで?
ダーティ リードを使用する必要がある、または使用しない理由:
set transaction isolation level read uncommitted
SQLサーバーで?
MSDNから:
このオプションを設定すると、コミットされていないデータやダーティ データを読み取ることができます。トランザクションが終了する前に、データの値を変更したり、データ セットで行を表示または非表示にすることができます。
簡単に言えば、この分離レベルを使用していて、1 つのトランザクションの一部としてアクティブなテーブルに対して複数のクエリを実行している場合、トランザクションのさまざまな部分で返される情報が同じままであるという保証はありません。1 つのトランザクション内で同じデータを 2 回クエリして、異なる結果を得ることができます (これは、トランザクション中に別のユーザーが同じデータを更新していた場合に発生する可能性があります)。これは明らかに、データの整合性に依存するアプリケーションの部分に深刻な影響を与える可能性があります。
通常、ビジーなテーブルに対してかなりの (または頻繁な) クエリを実行する必要がある場合、コミットされた読み取りがコミットされていないトランザクションからのロックによってブロックされる可能性がありますが、不正確なデータを扱うことができる場合のみです。
例として、私が最近取り組んだゲーム Web サイトでは、最近のゲームに関するいくつかの統計の要約が表示されていました。これはすべてダーティ リードに基づいていました。まだコミットされていないトランザクション データを含めてから除外することがより重要でした (いずれにせよ、バックアウトされるトランザクションがあったとしてもほとんどないことはわかっていました)、平均して、データはその方がより正確になると感じました.
データをすぐに戻したい場合に使用し、それが
正しいかどうかはそれほど重要ではない場合、データが正しいことが重要である場合、またはデータで更新を行っている場合は使用しないでください
SQL Server 2005 で導入されたスナップショット分離もご覧ください。
重要なのは、コミットする前にデータを読み取りたい場合です。トランザクション分離レベルを読み取り非コミットに設定することで、データが変更される場合と変更されない場合があります。
クエリを使用してデータを読み取ることができます。
Select * from table_name with(nolock)
これは、コミットされていない分離レベルの読み取りのみに適用されます。