提问者:小点点

WCF中的TransactionScope


下面给出的是我的示例代码。它们都是来自客户端的服务同步调用。我这里的问题是,我的远程服务将如何知道调用-

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    try
    {
        ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
        obj.UpdateData();
        ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
        obj1.UpdateData();
        ts.Complete();
    }
    catch (Exception ex)
    {
        ts.Dispose();
    }
}

我正在使用WSHttp绑定。我的问题是:

  1. WSHttp绑定和basicHttpBind都支持事务吗?
  2. 在“ts.完成()”调用期间,或在客户端范围内的异常期间,是否会对远程WCF服务进行请求调用以使事务管理器提交/回滚他的工作?

共2个答案

匿名用户

WSHttp绑定和basicHttp绑定都支持事务吗?

您需要使用WSHttpBind来使用TransactionScope,因为BasicHttpBind不支持事务所需的WS-*标准。

在“ts.完成()”调用期间或在客户端范围内的异常期间,是否会对远程wcf服务进行请求调用以使事务管理器提交/回滚他的工作

完整调用并不能保证所有内容都提交。这告诉事务管理器你完成了。是对事务所有者的完整调用导致事务管理器通知各方提交或回滚。如果它不能与各方通信,它将抛出异常。

因此,为了回答这个问题,对子参与者(即不是所有者)的完整调用不会导致对事务管理器的调用,但来自所有者-参与者的完整调用确实会调用事务管理器,然后事务管理器将尝试提交。

匿名用户

TransactionScope使用MSDTC:

MSDTC是微软分布式事务协调器的首字母缩写。顾名思义,MSDTC是一种为分布式系统提供事务基础设施的Windows服务。在这种情况下,事务意味着构建分布式系统中自治代理之间交互的一般方式。每个事务都是具有四个关键属性的状态转换——ACID属性:原子(全部或全部)、一致(合法)、隔离(独立于并发事务)和持久(一旦发生,就不能被废除)。实现ACID属性的技术有不同,但最著名的是两阶段提交。

你应该从这篇文章开始:http://blogs.msdn.com/b/florinlazar/archive/2004/03/04/what-is-msdtc-and-why-do-i-need-to-care-about-it.aspx