【问题标题】:TransactionScope across AppDomains and processes跨 AppDomain 和进程的 TransactionScope
【发布时间】:2011-03-18 04:50:50
【问题描述】:

跨不同的 AppDomain 和进程使用 System.Transactions(主要是 TransactionScope)是真的吗?

DependentTransaction 只能在一个 AppDomain 内工作。

【问题讨论】:

    标签: .net database ado.net transactionscope system.transactions


    【解决方案1】:

    是的,它有效。我们通过 WCF 处理事务,调用进程事务性 COM+ 组件,并手动将事务从 .NET 2.0 asmx Web 服务传递到 WCF 服务。

    现在这并不是说设置不挑剔。我认为大多数问题都与在所有服务器上正确设置 MSDTC 有关。

    更新

    我们不使用DependentClone。我们使用GetTransactionFromTransmitterPropagationToken 将事务作为字节数组传递。与Propagating a Transaction Across AppDomains的第二个例子非常相似。

    举个例子:

    客户:

    public void CallOutOfProcessAndPassTransaction
    {
        Client client = new Client();
    
        client.DoSomethingTransactional(
            System.Transactions.TransactionInterop.GetTransmitterPropagationToken(
                System.Transactions.Transaction.Current)
        );
    }
    

    服务:

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

    【讨论】:

    • 能否详细介绍一下将事务传递到另一个 AppDomain 的过程?您是通过调用 currentTransaction.DependentClone 创建克隆并传递它还是只传递当前事务?
    • 那么提交这样的事务呢?我想我只能从初始 AppDomain 提交它?
    • @ldsa:当您在应用程序域中传递事务时,您将处理分布式事务。要提交事务,所有参与者都必须投票提交。例如appdomain1 和 appdomain2 都必须提交。
    【解决方案2】:

    我发现这种解决方案存在问题。就我而言,我在父母和多个孩子身上工作。为了让它工作,我必须只在父级中使用 TransactionScope。我自己的问题/答案在Using transactions across processes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多