6

私は C#.Net でセルフ プロジェクトを作成しています。3 層アプリを使用して、SQL ステートメントをトランザクション対応にしたくありません。これらのステートメントは複数のストアド プロシージャで使用されています。WITH(NOLOCK) を使用しています。トランザクション中に挿入または更新に使用されたテーブルをクエリするためのアプローチであり、C# 側では TransactionScope を使用していますが、最近、WITH(NOLOCK) を使用するとファントムにつながる可能性があるため、推奨されないことを読みました。ダーティで一貫性のないデータを読み取ったり、使用したりします。私の質問は、トランザクション中に挿入または更新されたデータを使用するために、データベース側またはビジネス コード側のどちらであるかを選択する場合、トランザクション操作の観点から最善のアプローチは何ですか?

4

4 に答える 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 に答える