Is it real to use System.Transactions (primarily TransactionScope) across different AppDomains and processes?
DependentTransaction works only inside one AppDomain.
The TransactionScope class provides a simple way to mark a block of code as participating in a transaction, without requiring you to interact with the transaction itself. A transaction scope can select and manage the ambient transaction automatically.
An ambient transaction is one that works at the thread level. Thus, all operations that occur in that context will be part of the transaction.
The TransactionScope class makes a code block transactional by implicitly enlisting connections in a distributed transaction. You must call the Complete method at the end of the TransactionScope block before leaving it. Leaving the block invokes the Dispose method.
Yes, it works. We are flowing transactions via WCF, calling out of process transactional COM+ components, and manually passing transactions from a .NET 2.0 asmx web service to a WCF service.
Now that is not to say that the setup is not finicky. I think most of the issues were around getting MSDTC set up properly on all the servers.
UPDATE
We don't use DependentClone
. We are passing the transaction as a byte array using GetTransactionFromTransmitterPropagationToken
. Very similar to the second example of Propagating a Transaction Across AppDomains.
As an example:
Client:
public void CallOutOfProcessAndPassTransaction
{
Client client = new Client();
client.DoSomethingTransactional(
System.Transactions.TransactionInterop.GetTransmitterPropagationToken(
System.Transactions.Transaction.Current)
);
}
Service:
public void DoSomethingTransactional(byte[] tx)
{
using (TransactionScope ts = new TransactionScope(
TransactionInterop.GetTransactionFromTransmitterPropagationToken(tx)))
{
// Do Something
// vote to commit the transaction if the caller also agrees
ts.Complete();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With