私は C#.Net でセルフ プロジェクトを作成しています。3 層アプリを使用して、SQL ステートメントをトランザクション対応にしたくありません。これらのステートメントは複数のストアド プロシージャで使用されています。WITH(NOLOCK) を使用しています。トランザクション中に挿入または更新に使用されたテーブルをクエリするためのアプローチであり、C# 側では TransactionScope を使用していますが、最近、WITH(NOLOCK) を使用するとファントムにつながる可能性があるため、推奨されないことを読みました。ダーティで一貫性のないデータを読み取ったり、使用したりします。私の質問は、トランザクション中に挿入または更新されたデータを使用するために、データベース側またはビジネス コード側のどちらであるかを選択する場合、トランザクション操作の観点から最善のアプローチは何ですか?
3720 次
4 に答える
4
スナップショット分離を検討しましたか? 完全な読み取り一貫性を提供し、データをまったくロックしません。
SI は多くの RDBMS で標準であり、デフォルトでオンになっています。なぜSQL Serverの人々がそれを使うのをためらうのか分かりません. 欠点は軽度ですが、それらを調査する必要があります。
于 2015-10-05T15:24:41.537 に答える
3
何が欲しいのかわからないのかもしれません。
WITH(NOLOCK) はダーティで一貫性のないデータを返します。
クリーンなデータが必要な場合は、この句を削除し、読み取り対象のテーブルで最終的な同時更新を待機する必要があります。
于 2015-10-05T14:20:39.090 に答える
3
あなたは単にそれを必要としません。一部のデータを変更し、後で同じトランザクションでクエリを実行すると、変更されたデータが取得されます。
トランザクションは変更されたデータに対して排他ロックを保持するため、クエリ、再変更など、何でも実行できます。
WITH(NOLOCK) を指定すると、クエリが OTHER トランザクションからの排他ロックを無視できるようになります。クエリが正しくないデータを返す原因となります。
于 2015-10-05T14:18:24.323 に答える