2

Dans mon application, j'utilise le modèle suivant pour appeler le DB:.net DETECT distribués transaction

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

Le problème est que Opération1 et Opération2 90% du temps utilisent la même db ... mais il y a cas (bogues) lorsqu'ils utilisent deux DB. Je veux obtenir une exception si la transaction est distribuée.

Comment puis-je détecter si la transaction est promue dans une transaction distribuée?

Merci, Radu

Répondre

3

Jetez un oeil à la DistributedTransactionPermissionAttribute. Il utilise la classe DistributedTransactionPermission qui est l'autorisation demandée par System.Transactions lorsque la gestion d'une transaction est transmise à MSDTC (à partir de doc).

Vous pouvez l'appliquer à votre code. Une exception de sécurité doit être déclenchée lors de l'escalade.

+0

+1 Pour votre conseil. Maintenant, j'ai une exception chaque fois que mon code traverse la ligne. Merci beaucoup –

0

Bien que votre TransactionScope est en cours, vous pouvez tester:

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

DistributedIdentifier est dit nulle si la transaction est pas encore promu à distribué. À partir de sa section de remarques, documentation:

Si la transaction est escaladée en une transaction de validation en deux phases, cette propriété renvoie son identificateur unique. Si la transaction n'est pas escalalisée, la valeur est null.

Puisque cette propriété n'est pas Nullable, cela est manifestement erroné en principe. Mais en vérifiant avec ILSpy, c'est Guid.Empty à la place (qui est default(Guid)) quand la transaction n'est pas distribuée. (Mais peut-être que certaines transactions non MSDTC distribuées ne respecteront pas cela.)