Search code examples
.netdatabaseado.nettransactionscopesystem.transactions

TransactionScope across AppDomains and processes


Is it real to use System.Transactions (primarily TransactionScope) across different AppDomains and processes?

DependentTransaction works only inside one AppDomain.


Solution

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