【问题标题】:Transaction started only on client side交易仅在客户端开始
【发布时间】:2011-10-06 05:48:39
【问题描述】:

我需要实现以下场景: 如果客户端启动事务,它会流向服务器,但如果客户端没有启动事务,则必须在没有事务的情况下执行服务方法。可能吗?在我的情况下,如果没有 TransactionScopeRequired=true,事务就不会流动。

服务器:

 绑定>
  
   
    
     
      身份>
    端点>
    
    
     
      主机>
   服务>
  服务>
  
   
    
     
     行为>
   服务行为>
  行为>
 

    [服务合同]
    公共接口 ITcpTransactionalService
    {
        [运营合同]
        [TransactionFlow(TransactionFlowOption.Allowed)]
        无效 DoWork();
    }

    //[操作行为(TransactionScopeRequired = true)]
    公共无效 DoWork()
    {
      Debug.Assert(Transaction.Current != null);
      Debug.Assert(Transaction.Current.TransactionInformation.DistributedIdentifier != Guid.Empty);
    }


客户:

安全>
        绑定>
      绑定>
    
      
        
          身份>
      端点>
    客户>
  

    私有静态无效TestTcp()
    {
      使用 (var scope = new TransactionScope())
      {
        var client = new TcpTransactionalService.TcpTransactionalServiceClient();
        客户端.DoWork();

        Debug.Assert(Transaction.Current != null);
        Debug.Assert(Transaction.Current.TransactionInformation.DistributedIdentifier != Guid.Empty);

        范围。完成();
      }
    }

【问题讨论】:

    标签: wcf


    【解决方案1】:

    使用 TransactionScopeRequire=true

    如果客户端不发送事务,您最终不会进入分布式事务。如果是,那么你就这样做

    现在这仍然会在本地事务中调用您的操作。如果您想抑制这种情况,请检查分布式标识符。如果它的 Guid.Empty 在另一个像这样创建的 TransactionScope 中运行其余代码:

     if (Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)
     {
        using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
        {
           DoWork();
           scope.Complete();
        }
     }
     else
     {
            DoWork();
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多