交易仅在客户端开始
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();
【讨论】:
以上是关于交易仅在客户端开始的主要内容,如果未能解决你的问题,请参考以下文章