.NET分散トランザクションを検出します
-
28-09-2019 - |
質問
私のアプリケーションでは、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を使用する場合はケース(バグ)があります。トランザクションが配布された場合、例外を取得したいと思います。
トランザクションが分散トランザクションに宣伝されているかどうかを検出するにはどうすればよいですか?
ありがとう、ラドゥ
解決
次のイベントを見ることもできます
他のヒント
を見てください DistributedTransactionPermissionAttribute
. 。使用しています DistributedTransactionPermission
クラスWICHは、System.Transactionsによって要求される許可です。トランザクションの管理がMSDTC(DOC)にエスカレートされた場合。
コードに適用できます。エスカレーション時にセキュリティ例外を提起する必要があります。
あなたの間 TransactionScope
進行中です、あなたはテストすることができます:
Transaction.Current.TransactionInformation.DistributedIdentifier != default(Guid)
DistributedIdentifier
トランザクションがまだ分散に促進されていない場合、ヌルと言われています。そのドキュメントから、備考セクション:
トランザクションが2フェーズのコミットトランザクションにエスカレートされている場合、このプロパティは一意の識別子を返します。トランザクションがエスカレーションされていない場合、値は
null
.
このプロパティは気付かれないので、これは原則として明らかに間違っています。しかし、Ilspyで確認すると、そうです Guid.Empty
代わりに(それは default(Guid)
)トランザクションが分散されていない場合。 (しかし、一部の非MSDTC分散トランザクションはそれを尊重しないかもしれません。)