.net detect distributed transaction

人盡茶涼 提交于 2020-01-04 13:04:29

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!