交易仅在客户端开始

Posted

技术标签:

【中文标题】交易仅在客户端开始【英文标题】: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);

        范围。完成();
      
    

【问题讨论】:

【参考方案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();
 

【讨论】:

以上是关于交易仅在客户端开始的主要内容,如果未能解决你的问题,请参考以下文章

性能测试指标

仅在 DRF 中进行身份验证时才检查 CSRF?

SD从零开始64-特异的业务交易(Special Business Transactions)

仅在客户端下载文本文件[重复]

如何仅在 Sapper 的客户端上导入 Firebase?

比特币创建交易源码分析