关于WCF服务中的事务,我应该在使用服务的客户端应用程序中还是在服务代码中使用TransactionScope对象?请解释原因。
答案 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创建自动登记等),则操作将在同一分布式事务中运行