デッドロックの問題を解決するために、アプリケーションでテーブル ロック ヒントを使用するか、トランザクション分離レベルをデフォルトの 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") を使用せずに、テーブル ロック ヒントを追加できるようにする、実装できる拡張機能はありませんか