在WCF服务或客户端代理中的TransactionScope?

时间:2012-01-19 11:30:42

标签: wcf

关于WCF服务中的事务,我应该在使用服务的客户端应用程序中还是在服务代码中使用TransactionScope对象?请解释原因。

2 个答案:

答案 0 :(得分:2)

这取决于您的使用场景。如果您的服务功能执行应在事务中分组的多个调用,则应在服务功能中使用Transaction

当您的客户端调用应在一个事务中捆绑在一起的多个服务功能时,在客户端代码中使用Transaction非常有用。

例如:

public void MyServiceFunction1()
{
   using (TransactionScope transaction = new TransactionScope())
   {
      // execute some logic inside this service function that should be in a transaction
   }
} 

public void MyServiceFunction2()
{
   using (TransactionScope transaction = new TransactionScope())
   {
      // execute some logic inside this service function that should be in a transaction
   }
} 

public void MyClientFunction()
{
   using (TransactionScope transaction = new TransactionScope())
   {
      // Bundle both service calls in one transaction
      MyService service = new MyService();
      service.MyServiceFunction1();
      service.MyServiceFunction2();
   }
}

请注意,您需要正确configure your WCF bindings以确保事务从客户端传递到服务器。然后它将在分布式事务中自动升级。

答案 1 :(得分:1)

使服务交易意识到意味着如果传递了一个交易,它将在其中登记

无论是客户端应用程序还是其他服务,无论是客户应用程序还是其他服务,都必须创建一个事务(或者已经在流向它们的事务中运行)以使服务登记 - 因此他们必须从TransactionScope中调用该服务(通过让事务流向它们来显式或隐式地显示。

如果操作被标记为TransactionFlow(TransactionFlowOption.Allowed),那么消费者不必拥有交易,但服务将不会在流动的转换中执行

如果操作被标记为TransactionFlow(TransactionFlowOption.Mandatory),则客户端必须流动事务,并假设其他位已对齐(OperationBehavior创建自动登记等),则操作将在同一分布式事务中运行