.net обнаружить распределенную транзакцию - PullRequest
2 голосов
/ 25 ноября 2010

В моем приложении я использую следующий шаблон для вызова БД:

    //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% случаев используют один и тот же БД ... но есть случаи (ошибки), когда они используют две БД. Я хочу получить исключение, если транзакция станет распределенной.

Как я могу определить, повышена ли транзакция до распределенной транзакции?

Спасибо, Раду

Ответы [ 3 ]

4 голосов
/ 25 ноября 2010

Вы также можете посмотреть на следующее событие

Событие TransactionManager.DistributedTransactionStarted

3 голосов
/ 25 ноября 2010

Посмотрите на DistributedTransactionPermissionAttribute. Он использует класс DistributedTransactionPermission, который является разрешением, требуемым System.Transactions, когда управление транзакцией переходит в MSDTC (из документа).

Вы можете применить его к вашему коду. При эскалации должно возникать исключение безопасности.

0 голосов
/ 12 мая 2017

Пока ваш TransactionScope продолжается, вы можете проверить:

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

DistributedIdentifier называется нулевым, если транзакция еще не переведена в распределенную.Из документации, раздел примечаний:

Если транзакция преобразуется в транзакцию двухфазного принятия, это свойство возвращает свой уникальный идентификатор.Если транзакция не расширена, значение равно null.

Поскольку это свойство не имеет значения NULL, это, очевидно, неправильно в принципе.Но при проверке с помощью ILSpy вместо транзакции не распространяется Guid.Empty (то есть default(Guid)).(Но, возможно, некоторые не распределенные транзакции MSDTC не будут это учитывать.)

...