2010年做了一个大项目,使用.Net MVC 4作为主要技术栈,在全国40多个单位部署,系统很复杂,不同的业务数据存储在不同的数据库中,用到了微软的MSDTC分布式事务协调器。最近有一个单位对这个项目的服务器进行了升级和迁移,迁移后发发现分布式事务无法正常工作了。经过我们的排查才发现,该单位将应用和数据库分别迁移到不同的域环境导致MSDTC通讯失败。
经过一段时间的探索,发现在域不同的情况下,MSDTC除了常规的设置外,还需要在组件服务-我的电脑-属性--默认协议-面向链接的TCP/IP协议中添加指定端口或端口范围,然后在防火墙上设置开通应用服务器、数据库服务器之间的TCP 135,137,139端口(NETBOIS协议的控制端口),指定端口或端口范围的双通。同时在两台服务器的hosts文件中分别添加对方的ip hostname。
经过上面的设置,问题解除。
知识点:MSDTC基于NETBOIS协议,NETBOIS使用的是计算机名进行通讯。