• 热线电话
  • 置顶
  • 04-24

    MSDTC使用说明以及MSDTC不可用故障排除

    MSDTC使用说明

    DTC(Distributed Transaction Coordinator) ,分布式传输协调器,在windows系统中名为 MSDTC。主要用于管理当单一 指令取存取多张资料表时,所有指令完成后,才算完成指令,如果其中一资料表不正常,則该指令失效。当ASP.net程式中有声明Transactional(TransactionalTypes.TransactionScope)这一段时,就必需开启此功能。towns起初从未也沒使用过这个功能,直到公司有一大型网站,因用到该语法,才开放这个功能,当在本地运行网站(web程序与资料库同在一台主机上),只需运行该功能就能正常运行,當web程序与资料库不在一台主机上时,就必需注意防火墙的问题。下面会说明运行该功能的步骤和条件

    1. 确认DTC服务是否启动。

    控制台 ==>系統管理工具 ==>服务 ==>Distributed Transation Coordinator,是否启动,并设为自动启动 以下是当web程序与资料库分开时,才需要确认的。

    2. 确认DTC服务是否开放网路使用。

    控制台 ==> 系统管理工具 ==>元件服务 ==>电脑 ==>我的电脑 ==> Distributed Transation Coordinator ==>本机DTC 上按滑鼠右键 ==>内容 ==>安全性==>确定网路DTC存取、允许远端用户端、允许输入、允许输出、不需要验证、启用SNA LU 6.2交易,都有勾选 ==>确定

    3. NetBIOS 名称成功解析。

    NetBIOS 名称解析在两个方向(用户端至伺服器以及伺服器至用户端)上都运作正常。简单的说就是web程序与资料库的网路共享必需能正常运作(必需能看到彼此)

    4. 防火墙管理

    4.1 MSDTC所开启的连接埠并不是固定的,他是由RPC(Remote Procedure Call;远端程序呼叫)做动态连接埠配置,也就是说,如果要要求MSDTC使用固定连接埠,就必需管理RPC服务。看到这裡,towns就知道惨了,有很多的服务,都是依附著RPC服务,如Task Scheduler(工作排程器服务)、IIS AdminService(IIS6管理介面服务)、windowsupdate(微软更新服务)等等…约有70项服务(windows server 2012的服务)都依存著RPC,一但要设定,所有要使用到连接埠的服务,都需要设定,towns必需要在测试中测试了,一但设错,这70项服务都会出错。

    4.2 到 控制台 ==> 系统及安全性 ==> Windows 防火墙 ==>允许程式或功能通过Windows防火墙 ==>将分散式交易协调器后面的两个方框都打勾(私人及公用)==> 确定

    4.3 另一方式,就是关闭资料库主机的防火墙,完全不用设定了 ^0^ 一般来说,如果web与资料库必需分开,前端多半会有一台防火墙设备了,关闭资料库主机的防火墙也许就不会这么危险了

    以上步骤如果都确认了,一般而言在大型环境中的DTC服务应该就都没问题了 towns在实际测试中,有发生就算是关闭了两台主机的防火墙,也是发生问题,直到重新开启资料库主机后,系统才正常,真是有点奇怪了

    补充:两台主机都必需设定

    关于MSDTC无法使用的问题

    这是因为安装SQL 2005时,默认状态下是不会开启MSDTC服务,所以只需要开启改服务(开启方式参照上文)。

      为什麽须要开启这项服务呢?我们先看一下,商业物件与资料存取有关的程式码,就以《第07章 可编辑根物件清单》为例:

                 [Transactional(TransactionalTypes.TransactionScope)]
                 protected override void DataPortal_Update()
                 {
                 this.RaiseListChangedEvents = false;
                 Child_Update();
                 this.RaiseListChangedEvents = true;
                 }
      是否有留意到『 [Transactional(TransactionalTypes.TransactionScope)]』这个属性声明。如果不加上这个声明,MSDTC服务不启动也没有关系,但是加上这个声明是有其含意的。

      比如说,一张订单其资料表会分成主资料表,用来记录类似订货日期、客户名称等主要资讯,明细资料表会用来记录各项类似产品名称、单价、订购数量等订货名细。而一张订单写入(或更新)资料库的过程,只要有其中有一道过程失败(比如其中的一项明细写入失败),整个交易就应该要算失败,所有先前已经写入(或更新)的就必须回复到原先的状态。

      所以该项声明就是用来指定,接下来的所有对资料库的操作都是属于同一笔交易,而「Distributed Transaction Coordinator」服务正是用来监控是否每一道过程都有成功。