質問

私のアプリケーションでは、DBを呼び出すために次のパターンを使用します。

    //do a transaction 
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
{
    OperationOnDb1();

    //when we open the connection to the “other db” in this call, the transaction would become distributed
    OperationOnDb2();

    //transaction is now distributed
    transaction.Complete();
}

問題は、Operation1とOperation2の時間の90%が同じDBを使用することです...しかし、2つのDBを使用する場合はケース(バグ)があります。トランザクションが配布された場合、例外を取得したいと思います。

トランザクションが分散トランザクションに宣伝されているかどうかを検出するにはどうすればよいですか?

ありがとう、ラドゥ

役に立ちましたか?

解決

次のイベントを見ることもできます

TransactionManager.DistributeDtransaction -Startedイベント

他のヒント

を見てください DistributedTransactionPermissionAttribute. 。使用しています DistributedTransactionPermission クラスWICHは、System.Transactionsによって要求される許可です。トランザクションの管理がMSDTC(DOC)にエスカレートされた場合。

コードに適用できます。エスカレーション時にセキュリティ例外を提起する必要があります。

あなたの間 TransactionScope 進行中です、あなたはテストすることができます:

Transaction.Current.TransactionInformation.DistributedIdentifier != default(Guid)

DistributedIdentifier トランザクションがまだ分散に促進されていない場合、ヌルと言われています。そのドキュメントから、備考セクション:

トランザクションが2フェーズのコミットトランザクションにエスカレートされている場合、このプロパティは一意の識別子を返します。トランザクションがエスカレーションされていない場合、値は null.

このプロパティは気付かれないので、これは原則として明らかに間違っています。しかし、Ilspyで確認すると、そうです Guid.Empty 代わりに(それは default(Guid))トランザクションが分散されていない場合。 (しかし、一部の非MSDTC分散トランザクションはそれを尊重しないかもしれません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top