首先,介绍一下偶的DTS包大致结构:大包由5个任务包和一些SQL任务组成,在包的设计过程中,应用到了Windows 的MSDTC服务,控制包中的分布式事物。SQLServer环境:SQLServer2000企业版+SP3
运行期一:Window2000Server(服务器)-Window2000Profassional(客户端)。比较顺利,处理好DTS包的链接事务处理后就可以正常运行,关于DTS包事务的设计,偶在这就不详细介绍了
运行期二:Window2003Server(服务器)-Window2000Profassional(客户端),Window2003Server刚刚安装的新系统。问题极多,主要是Windows2003下MSDTC服务的网络互访问题。即便MSDTC服务已经启动,但还是提示“不支持联接分布式事务或在试图联接时失败,新事务不能登记到指定的事务处理器中”等等错误。
运行期二分析及处理:Win2003Server新安装时,由于Win2003Server安全机制问题,很多服务是禁用的,集体的可以参考SCW(系统安全配置)的策略设置,系统的MSDTC网络访问被禁用,因此,必须设置一下MSDTC网络访问。步骤如下:
1. 单击“开始”,指向“所有程序”,指向“管理工具”,然后单击“组件服务”。
2. 在组件服务向导中,展开“组件服务”,然后双击“计算机”。
3. 右键单击“我的电脑”,然后单击“属性”。
4. 单击“MSDTC”选项卡,然后单击“安全性配置”。
5. 在“安全配置”对话框中,单击以选中“网络 DTC 访问”复选框。
6. 在“网络 DTC 访问”下,单击“网络事务”。
7. 确保“DTC 登录帐户”设置为“NT Authority/NetworkService”。
8. 单击“确定”。
9. 在消息框中,单击“是”。
10. 在“DTC 控制台消息”对话框中,单击“确定”。
11. 在“系统属性”对话框中,单击“确定”。
12. 重新启动计算机,让这些更改生效。
上面这段步骤是很多人推荐的,也是微软对于“分布式事务不能登记到事务处理器中”错误的解释及处理。很好,按上面步骤处理完之后,DTS包运行正常。
运行期三:上面基础上运行一段时间,Window2003Server系统自动更新(这就是原因所在,偶找了一晚上才发现的),DTS包依然出现错误,提示“不支持联接分布式事务或在试图联接时失败。新事务不能登记到指定的事务处理器中”
这就奇怪了,在网上查了很多文章,发觉推荐的都是上面的步骤,当初是解决了,但为何现在又突然间不行了呢?DTS包并为改动,偶换了一台服务器,也是Window2003Server,发觉链接服务器正常,DTS包运行正常。这基本上可以确定是系统环境的关系,但对于原机器,为何前后区别这么大呢?问了一下机器管理员,原来当天刚刚更新了一下系统补丁,当然我怀疑过机器中病毒,但发觉并没有病毒,所以,查找目标锁定在系统补丁更新这个改变上。
后来,在一篇文章中发现,有人建议的Win2003下MSDTC网络访问设置有点区别,就是在上述步骤的前后各加一步,即
<1>注册表,HKEY_LOCAL_MACHINE/Software/Microsoft/MSDTC 增加DWORD的键TurnoffRpcSecurity=1
……
<14>删除第一步骤的TurnoffRpcSecurity
但是,文章的作者后面加了这么一句,也就是操作注册表的这两步不用执行也可以。
虽然上述文章作者说了不操作注册表也可以,但是,据我现在的系统运行状况,前后的变化,以及机器环境的差异性,偶决定对比一下两台服务器的注册表的区别HKEY_LOCAL_MACHINE/Software/Microsoft/MSDTC结果如下:
正常的服务器:
AllowonlySecureRpcCalls=0
TurnoffRpcSecurity=1
异常的服务器:
AllowonlySecureRpcCalls=1
TurnoffRpcSecurity=0
将异常服务器按照正常服务器的设置改动了,然后重启MSDTC服务,发觉正常了,但改回原状,重器服务,更出现一样的错误提示,嗯,基本上可以确定就是这样问题了。分析一下,很明显,这跟系统的RPC调用的安全机制有关系,而且,我尝试了之更改TurnoffRpcSecurity或是AllowonlySecureRpcCalls的值,也就是其他三个组合,都是不行。
到了这步,才舒了口气,系统更新了个RPC漏洞补丁,导致MSDCTC服务的远程RPC调用策略设置改变了,所以才导致这些莫名其妙的错误。至此,问题解决!
同时,MSDTC服务的网络访问策略对Win2003与Win2000之间链接服务器互访,我相信也会有相应的影响