问题
In my application I use the following pattern for calling the 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();
}
The problem is that Operation1 and Operation2 90% of the time use the same db ... but there are cases (bugs) when they use two DBs. I want to get an exception if the transaction becomes distributed.
How can I detect if the transaction is promoted to a distributed transaction?
Thanks, Radu
回答1:
You can also have a look at the following event
TransactionManager.DistributedTransactionStarted Event
回答2:
Have a look at the DistributedTransactionPermissionAttribute. It's using the DistributedTransactionPermission class wich is the permission that is demanded by System.Transactions when management of a transaction is escalated to MSDTC (from doc).
You could apply it to your piece of code. A security exception should be raised on escalation.
回答3:
While your TransactionScope is ongoing, you may test:
Transaction.Current.TransactionInformation.DistributedIdentifier != default(Guid)
DistributedIdentifier is said to be null if the transaction is not yet promoted to distributed. From its documentation, remarks section:
If the transaction is escalated to a two-phase commit transaction, this property returns its unique identifier. If the transaction is not escalated, the value is
null.
Since this property is not nullable, this is obviously wrong in principle. But checking with ILSpy, it is Guid.Empty instead (which is default(Guid)) when the transaction is not distributed. (But maybe some non MSDTC distributed transaction will not respect that.)
来源:https://stackoverflow.com/questions/4274887/net-detect-distributed-transaction