SQL分布式事务,在郁闷的研究了一近十天后,终于弄通了,环境WIN2K3+SQL2000/SQL2005
所有问题总结如下(包括网上资料总结)
1、问题一
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d01c]。
解决办法:
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"192.168.0.34" /U"dl" /P"333263" /q"exec
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"192.168.0.34" /U"dl" /P"333263" /q"exec
master..xp_cmdshell ''net start msdtc'',no_output"',no_output
--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output
exec master..xp_cmdshell 'net start msdtc',no_output
2、问题二
出错信息:
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned
出错信息:
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned
0x8004d00a]。
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
解决办法:因为其中一台服务器不支持'SQLOLEDB' ,于是把语句换成在这台服务器上执行。
调试方法:
一.A.不用事务,关用SELECT 语句.是否可以分布式查询?
B.LINKSERVER 在做分布式更新事务时不能对本机操作.(就是不能环回分布式事务)
C.DBCC TRACEON (3604, 7300)--用跟踪看更详细错误信息.
D.下载MS提供的DTCPing.exe 分装在两台机上,按README说明来运行它.看出错信息.
http://download.microsoft.com/download/complus/msdtc/1.7/nt45/en-us/DTCPing.exe
二.两台机的MSDTC是否都打开了.
三.MSDTC设置是否正确.
1.打开命令提示,运行"net stop msdtc",然后运行"net start msdtc"。
2.转至"组件服务管理工具"。
3.浏览至"启动管理工具"。
4.选择"组件服务"。
a.展开"组件服务"树,然后展开"我的电脑"。
b.右键单击"我的电脑",然后选择"属性"。
C.在 MSDTC 选项卡中,确保选中了下列选项: 网络 DTC 访问
网络管理
网络事务
XA 事务
e.另外,"DTC 登录帐户"一定要设置为"NT Authority/NetworkService"。
5.单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动。
所有的依赖服务将被停止。请按'是'继续"。单击"是"继续。
6.单击"确定"关闭"我的电脑"属性窗口。
四.
MSDTC依赖于RPC,RPC使用的端口是135,测试135端口是否打开.是否有防火墙?如果有先关了防火墙.
telnet IP 135
如果是关闭的打开它.
五.
有的机由于各种原因),SQLOLEDB不能使用分布式事务,更改为"MSDASQL" 的ODBC方式联接.
使用RRAS而不是RAS.(控制面版--管理工具--远程服务管理器)
Check whether you are using Remote Access Server (RAS) to access remote servers. If so, make
一.A.不用事务,关用SELECT 语句.是否可以分布式查询?
B.LINKSERVER 在做分布式更新事务时不能对本机操作.(就是不能环回分布式事务)
C.DBCC TRACEON (3604, 7300)--用跟踪看更详细错误信息.
D.下载MS提供的DTCPing.exe 分装在两台机上,按README说明来运行它.看出错信息.
http://download.microsoft.com/download/complus/msdtc/1.7/nt45/en-us/DTCPing.exe
二.两台机的MSDTC是否都打开了.
三.MSDTC设置是否正确.
1.打开命令提示,运行"net stop msdtc",然后运行"net start msdtc"。
2.转至"组件服务管理工具"。
3.浏览至"启动管理工具"。
4.选择"组件服务"。
a.展开"组件服务"树,然后展开"我的电脑"。
b.右键单击"我的电脑",然后选择"属性"。
C.在 MSDTC 选项卡中,确保选中了下列选项: 网络 DTC 访问
网络管理
网络事务
XA 事务
e.另外,"DTC 登录帐户"一定要设置为"NT Authority/NetworkService"。
5.单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动。
所有的依赖服务将被停止。请按'是'继续"。单击"是"继续。
6.单击"确定"关闭"我的电脑"属性窗口。
四.
MSDTC依赖于RPC,RPC使用的端口是135,测试135端口是否打开.是否有防火墙?如果有先关了防火墙.
telnet IP 135
如果是关闭的打开它.
五.
有的机由于各种原因),SQLOLEDB不能使用分布式事务,更改为"MSDASQL" 的ODBC方式联接.
使用RRAS而不是RAS.(控制面版--管理工具--远程服务管理器)
Check whether you are using Remote Access Server (RAS) to access remote servers. If so, make
sure that you have implemented Routing RAS (RRAS). Linked server does not work on RAS
because RAS allows only one way communication.
七.检查你的两台服务器是否在同一个域中.
如果不在同一个域中,是否建立可信任联接.
八.如果是WIN2000,升级到SP4
九.升级MDAC到2.6以上,最好是2.8.
十.要安装SQL的最新补丁: sp3a
'全部补丁的位置
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a -
七.检查你的两台服务器是否在同一个域中.
如果不在同一个域中,是否建立可信任联接.
八.如果是WIN2000,升级到SP4
九.升级MDAC到2.6以上,最好是2.8.
十.要安装SQL的最新补丁: sp3a
'全部补丁的位置
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a -
4537-a2b6-4cb265b80766
'应该安装的补丁sql 2000 sp3
http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c -
'应该安装的补丁sql 2000 sp3
http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c -
d11a66b03816/chs_sql2ksp3.exe
如果以后设置仍然不能解决问题,请继续以下操作
*****确认防火墙打开了135端口,并允许MSDTC.EXE程序运行,如果是WIN自带防火墙,请添加例外程序:C:/WINDOWS/system32/msdtc.exe
*****请确认是否安装了NETBIOS协议,或者确认两台机器可以使用计算机名而不是IP,PING通过,否则请在C:/WINDOWS/system32/drivers/etc/hosts”文件中增加一条记录:
xxx.xxx.xxx.xxx 服务器名
作用同样是把服务器名对应到链接服务器的ip地址。
*****最后,请检查注册表HKEY_LOCAL_MACHINE/Software/Microsoft/MSDTC,确认设置如下:
AllowonlySecureRpcCalls=0
TurnoffRpcSecurity=1
由于WIN2K3的安全设置较高,默认设置或打了最新安全补丁后,都可能更改注册表,所以,一旦运行中出现错误,此应为第一检查项