.net обнаруживает распределенную транзакцию

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

    //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();
}

Проблема в том, что Операция1 и Операция2 90% времени используют одну и ту же БД... но бывают случаи (баги) когда они используют две БД. Я хочу получить исключение, если транзакция станет распределенной.

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

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


person Radu D    schedule 25.11.2010    source источник


Ответы (3)


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

Событие TransactionManager.DistributedTransactionStarted

person Hps    schedule 25.11.2010

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

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

person Simon Mourier    schedule 25.11.2010
comment
+1 За ваш совет. Теперь у меня есть исключение всякий раз, когда мой код пересекает линию. Большое спасибо - person Julio Nobre; 07.11.2012
comment
Похоже, современная среда выполнения .NET игнорирует атрибуты CAS. - person yallie; 29.05.2021
comment
@yallie - абсолютно - person Simon Mourier; 29.05.2021

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

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

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

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

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

person Frédéric    schedule 12.05.2017