0

デッドロックの問題を解決するために、アプリケーションでテーブル ロック ヒントを使用するか、トランザクション分離レベルをデフォルトの Read Committed 以外に設定する必要がある状況に遭遇しています。私はサービス指向アーキテクチャを使用しており、各サービス呼び出しはアトミック操作として動作し、Linq To Sql は軽量 DAL として機能しています。各サービス呼び出しは、私のビジネス レイヤーを呼び出し、次のような新しいトランザクションを宣言します。

using (var scope = new TransactionScope())
{
   // Get datacontext

   // do Business Logic stuff, including database operations via Linq To Sql

   // Save transaction
   scope.Complete();
}

問題は、多くのデータベース操作を必要とする複雑なビジネス ロジックがある場合があることです。一部の読み取り、一部の書き込み、更新のための一部の読み取りなどは、すべて同じサービス呼び出し内で行われるため、同じトランザクションになります。

Linq To Sql がテーブル ロック ヒントを linq クエリに追加できないことについて読んだことがありますが、代わりに TransactionScope 分離レベルを使用するという解決策が提案されています。それは素晴らしいことですが、私の状況では、各トランザクションがアトミックなサービス呼び出しを目的としている場合、これがどこで機能するかわかりません。たとえば、ロックせずに 1 つのテーブルを読み取る必要があり、ダーティ リードは問題ない可能性がある場合、方向転換して更新のために別の読み取りを行い、更新を行います。トランザクション全体に Read Uncommitted を設定するのではなく、特定の読み取りのみを設定したいのですが、どうすればよいですか?

ビューやストアド プロシージャを使用せずに、または datacontext.ExecuteQuery("my raw sql string here") を使用せずに、テーブル ロック ヒントを追加できるようにする、実装できる拡張機能はありませんか

4

1 に答える 1

0

ここでの最良の答えは、複数のトランザクションを使用し、「ダーティ」のみを読み取るトランザクションを 1 つのバッチでバッチ処理し、コミットされた読み取りを必要とする更新を別のバッチでバッチ処理することだと思います。バッチをまたがる必要がある情報がある場合は、そのデータのメモリ内一時キャッシュをセットアップします。

于 2011-01-27T16:56:29.530 に答える