SQL Serverの2014データベースはREAD_COMMITTED_SNAPSHOT
に設定されています。MSMQとSQL Serverで分散トランザクションが発生することがありますが、ダーティリードが発生することがあります。
我々は、すべての下に(キューに新しいメッセージを公開し、データベースの更新を行い、我々はキューからのメッセージを読んで、私たちのシステムの一部ではMSMQと分散トランザクション(私たちはMassTransit 2.10を使用)
を使用し、単一トランザクション)。
次のメッセージが処理されたときに更新がコミットされない(最初の部分の更新が同じテーブルから読み込まれる)ときに、そのメッセージがキューにのみ存在すると予想されるにもかかわらず、データベースが更新されるのと同時に。後でテーブルをクエリすると、更新されたデータが期待どおりに存在します。これは、負荷が高く、ごくまれにしか発生しない場合に発生します。
だからここ// code that processes message 1
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { Timeout = TimeSpan.FromMinutes(30), IsolationLevel = IsolationLevel.ReadCommitted })
{
MethodThatUpdatesTableX();
MethodThatCreatesMessage2();
scope.Complete();
}
// message picked up from MSMQ and then (this runs in different thread):
// code that process message 2
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { Timeout = TimeSpan.FromMinutes(30), IsolationLevel = IsolationLevel.ReadCommitted })
{
MethodThatReadsFromTableX(); // so here it seems that changes made in MethodThatUpdatesTableX is sometimes (though rarely) not read
// other stuff
}
我々のコードの
簡易版は、私の理解です:スコープがキューに公開を約束されているテーブルのXへの変更だけでなく、メッセージを配置されている
MethodThatReadsFromTableX()
テーブルXIから読み取ると、変更がそこにあると予想されます(キューからメッセージを受け取ることができないため、最初のセッションが完了する前にセッションを作成しないでください)
私の期待は正しいですか?何が問題なの?