2011-07-20 10 views
3

MSMQエンドポイントを使用しています。 私のサービスで次の属性を設定しました。インターフェイス上で WCF(MSMQ)サービスでDTCを無効にする

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
public void MyMethod(MyParam param) { ... } 

は私が

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)] 

を持っている私は、SQL Serverデータベースへの更新を行い、MSDTCが常に使用され、トランザクションが促進されるメソッドを持っています。

これを抑制するにはどうすればよいですか。 MSMQトランザクションと完全に別個のトランザクションにあるSQL Serverへの接続を作成するにはどうすればよいですか。 DTCトランザクションではなく、SQLトランザクションのみが必要です。 SQLトランザクションがMSMQトランザクションのスコープに含まれないようにする方法はありますか?

私はこれを、私が検討しているMSMQ上で完全にトランザクションを取り除かずに済ませたいと考えています。

よろしく

クレイグ

+0

DTCトランザクションは、MSMQとSQLの更新をまとめて保持します。トランザクションを分離すると、MSMQメッセージがSQLの更新に使用されることを保証できません。信頼性の高いMSMQメッセージがまだありますが、メッセージから抽出されたデータは保護されません。メッセージの読み込みとデータベースへの書き込みとの間にエラーがあった場合、回復はありません。 –

答えて

6

あなたは、トランザクションMSMQのコア意味について訴えています。トランザクションMSMQは、トランザクションの読み込みとキューへの書き込みを使用します。したがって、トランザクションでメッセージが読み取られ、読み取り/処理に失敗した場合は読み取りがロールバックされ、メッセージはキューから削除されません。 TransactionScopeRequiredで作業をマークすると、WCFにyour operation is part of message's transactional processingと伝えられます。データベース操作が失敗した場合、MSMQの読み込みにも失敗し、メッセージは失われません。トランザクションでデータベース接続を開くと、単一トランザクションで2つのトランザクションリソースがあるため、トランザクションはDTCに昇格されます。

このメカニズムを使用したくない場合は、トランザクションキューを使用せずに注意深く考えてください。トランザクションキューをオフにする理由は、分散トランザクションを必要としないようにする必要はないということです。

+0

DTCの問題点は、バグがあり、遅いことです。 – Jim

+4

残念ですが、キューの処理の中でデータベースを更新しています。ファイルioやその他のメカニズムを使用していた場合は、一貫性を維持することができました。これを読んだ他の人は、実際にはトランザクションなしでデータベースを更新できるようにする新しいTransactionScope(TransactionScopeOption.Suppress)を使用してキューメソッド内のトランザクションを抑制できることに注意してください。 – Jim

関連する問題