MSDTC

来源:互联网 发布:互易二端口网络 编辑:程序博客网 时间:2024/03/29 13:07

insert into OPENDATASOURCE('SQLOLEDB', 'Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=Foryoumedia;Data Source=10.3.10.6').Foryoumedia.dbo.PROMB
   (MB001,MB002,MB003,MB004,MB005,MB006,MB025) values (@tempMB1,@tempMB2,@tempMB3,@tempMB4,0,0,'未建立评审流程。')

msdtc(服务名:Distributed Transaction Coordinator) MSDTC服务显示的名称是"Distributed Transaction Coordinator"是微软分布式传输协调程序。该进程调用系统Microsoft Personal Web Server和Microsoft SQL Server。该服务用于管理多个服务器
命令提示符下输入:msdtc -resetlog
应用语句如下:
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"192.168.253.5" /U"dl" /P"333263" /q"execmaster..xp_cmdshell ''net start msdtc'',no_output"',no_output--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output
insert into dayquantity(station_number,data_date,day_water_quantity)
(select us.station_number,date1,quantity from [192.168.253.5].manger.dbo.day_report da innerjoin [192.168.253.5].manger.dbo.userdata us on da.uid=us.uid where date1<'2005-9-1' andstation_number is not null)

遇到过的问题:
1、问题一
服务器: 消息 8501,级别 16,状态 1,行 1
服务器 'H' 上的 MSDTC 不可用。
服务器: 消息 7391,级别 16,状态 1,行 1
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned0x8004d01c]。解决办法:
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"192.168.253.5" /U"dl" /P"333263" /q"execmaster..xp_cmdshell ''net start msdtc'',no_output"',no_output--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output2、问题二
出错信息:
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned0x8004d00a]。
该操作未能执行,因为 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, makesure that you have implemented Routing RAS (RRAS). Linked server does not work on RASbecause 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-4537-a2b6-4cb265b80766
'应该安装的补丁sql 2000 sp3
http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c-d11a66b03816/chs_sql2ksp3.exe在分布式查询中使用 Transact-SQL 语句访问单独的 SQL Server 实例上的数据或非 SQL Server 数据源,而这些数据可存储在相同或不同的计算机上。操作步骤如下:1、配置 OLE DB 提供程序和链接服务器
使用存储过程:
使用 sp_addlinkedserver 创建链接服务器的定义。若要查看有关给定的 SQL Server 实例中定义的链接服务器的信息,请使用 sp_linkedservers。
使用 sp_dropserver 删除链接服务器的定义。还可以使用此存储过程删除远程服务器。
使用 SQL Server 企业管理器:
使用 SQL Server 企业管理器控制台树和"链接服务器"节点(在"安全性"文件夹内)来创建链接服务器的定义。为链接服务器定义名称、提供程序属性、服务器选项和安全选项。
通过右击链接服务器并单击"属性"命令,可编辑链接服务器的定义。
通过右击链接服务器并单击"删除"命令,可删除链接服务器的定义。
2、编写sql语句操作各数据库服务器中的数据
引用外数据库服务器的对象的方式如下:数据库服务器名.数据库名.dbo.表名

SQL Server 分布式事务处理(MS DTC)初探

在联机文档中是这样描述MS DTC的:
Microsoft 分布式事务处理协调器 (MS DTC) 是一个事务管理器,它允许客户端应用程序在一个事务中包含多个不同的数据源。MS DTC 协调在所有已在事务中登记的服务器间提交分布式事务。
Microsoft® SQL Server™ 安装可通过下列方法参与分布式事务:
1,调用运行 SQL Server 的远程服务器上的存储过程。
2,自动或显式地将本地事务提升为一个分布式事务并在该事务中登记远程服务器。
3, 执行分布式更新以更新多个 OLE DB 数据源上的数据。如果这些 OLE DB 数据源支持 OLE DB 分布式事务接口,SQL Server 还可以将它们登记在分布式事务中。 MS DTC 服务协调正确完成分布式事务,以确保所有服务器上的全部更为永久性的,或在发错误时删除所有更新。
SQL->CREATE TABLE test1 ([id] int ,email varchar(50))
表test1在A服务器中,表email在B服务器中,其表结构和test1一样。在A服务器中运行
SQL->EXEC sp_addlinkedserver 'B','SQL Server'
SQL->GO
SQL->EXEC sp_addlinkedsrvlogin 'B','false','sa','sa','123456'
同样在B服务器中运行以上代码,不同的是服务器名称的变化。
在B服务器中执行如下语句:
SQL->CREATE PROCEDURE dbo.usp_test
SQL->AS
SQL->SELECT id,email FROM email
SQL->GO
这样就把为AB服务器互相添加了Linked Server,并在AB服务器中启动MSDTC服务。在A服务器中运行如下语句:
SQL->BEGIN TRANSACTION Ta
SQL->INSERT INTO test (id,email)
SQL->EXEC a.test.dbo.usp_test
SQL->COMMIT TRANSACTION Ta
运行出错,错误如下:
服务器: 消息 7391,级别 16,状态 1,行 1
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。 [OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ] OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。<br>估计是MSDTC的相关配置有问题。检查MSDTC配置。似乎都满足先制条件。苦思,终不得解,去网上找相关资料。终于不负有心人,找到了解决方法。继续……
组件服务--> a.展开"组件服务"树,然后展开"我的电脑"。b.右键单击"我的电脑",然后选择"属性"。C.在 MSDTC 选项卡中‘安全配置’按钮,确保选中了下列选项:网络 DTC 访问。网络事务 XA 事务 d.另外,"DTC 登录帐户"一定要设置为"NT Authority/NetworkService"。e单击"确定",重新启动MSDTC。

再次运行以上语句,结果成功。