日期:2014-05-18  浏览次数:20491 次

不知道这个问题该不该再发一次 还是触发器的问题
连接服务器的名称:TESTSrv
exec sp_addlinkedserver TESTSrv,'ms','SQLOLEDB','192.168.1.38'
exec sp_addlinkedsrvlogin TESTSrv,'false',NULL,'sa','123'


然后,我通过查询分析器,在数据库A上增加一条记录,但出现以下错误:
--------------------
服务器: 消息 7391,级别 16,状态 1,过程 InRole,行 16
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

------------------------
触发器脚本:
CREATE TRIGGER [InData] ON [dbo].[myHIT]  
AFTER INSERT
AS

BEGIN
--set xact_abort on
---BEGIN DISTRIBUTED TRANSACTION
--以上两句,加不加,一样的现象

DECLARE @rid INT  
DECLARE @rname VARCHAR(50)

SET @rid=-1
SET @rname=''

BEGIN TRAN
SELECT @rid = inserted.tID , @rname = inserted.tName FROM inserted  

INSERT INTO TESTSrv.myDB.dbo.t1(id,name) SELECT inserted.tID , inserted.tName FROM inserted  
COMMIT TRAN
END


//***********************************************************//

//**************************************************************//

重点说明下,这个问题有出多一年了

至今没看到实际能解决的办法

网上的办法 都被搜腻味了

不是你转我转

全是一个样

但方法,根本就不能实际的解决问题


//**************************************//
另外,在这里把网上抄来炒去的,却没有解决问题的所谓的方案在这里 晒下

如下:



SQL Server之分布式事务

(一)概念:

分布式事务是涉及来自两个或多个源的资源的事务。Microsoft® SQL Server? 2000支持分布式事务,使用户得以创建事务来更新多个SQL Server数据库和其它数据源。

分布式事务包括: 

·资源管理器 

控制分布式事务所涉及的每个资源的软件称为资源管理器。分布式事务由各个资源管理器内的本地事务组成。每个资源管理器必须能够与分布式事务内的所有其它资源管理器相协调,以提交或回滚自己的本地事务。SQL Server 可以作为分布式事务内的资源管理器工作,并遵从用于分布式事务处理的 X/Open XA 规范。 

·事务管理器 

提交或回滚分布式事务由称为事务管理器的软件组件控制。事务管理器与每个资源管理器相协调,确保一起提交或回滚所有组成分布式事务的本地事务。Microsoft分布式事务处理协调器 (MS DTC) 服务如事务管理器一样工作。MS DTC 遵从用于分布式事务处理的 X/Open XA 规范。 

·两阶段提交 (2PC) 

需要进行特殊的提交处理,以防止在管理跨越多个资源管理器的事务时出现问题。当刷新日志缓冲区使其可用时,提交大事务可能需要相对较长的时间。提交进程本身还可能遇到错误,需要强行回滚。如果事务管理器只是请求每个资源管理器提交,则可能从一些资源管理器返回成功状态,然后从某个资源管理器得到错误信息。这会导致冲突,因为所有分布式事务都应回滚,而部分事务已提交。两阶段提交通过将提交分成两相可以解决此问题:

·准备

事务管理器给每个资源管理器发送一个准备提交的请求。然后,每个资源管理器执行完成提交进程所需的所有大量占用资源的操作,如刷新所有日志缓冲区。资源管理器只保留维护事务完整性所需的最少的锁,然后给事务管理器返回成功状态。

·提交 

如果所有资源管理对发给它们的准备请求返回成功状态,事务管理器将给每个资源管理器发送提交命令。然后,每个资源管理器快速将事务记录为已完成,并释放上次控制的资源。如果有任何资源管理器对准备请求返回错误信息,事务管理器将给每个资源管理器发送回滚命令。 

有几种方法可以使应用程序在分布式事务内包括 SQL Server 2000: 

·如果应用程序有本地事务并且发出分布式查询,本地事务将升级到分布式事务。 

·发出 BEGIN DISTRIBUTED TRANSACTION 语句。 

·如果应用程序有本地事务并且将 REMOTE_PROC_TRANSACTIONS 选项设置为 ON,则调用远程存储过程将使本地事务升级到分布式事务。 

·使用用于 SQL Server 的 OLE DB 提供程序或 SQL Server ODBC 驱动程序的应用程序,可以使用 OLE DB 方法或 ODBC 函数让 SQL Server 连接联接由应用程序启动的分布式事务。

(二)案例

(2.1)問題描述

在执行分布式事务时,在sql server 2005下收到如下错误:

消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行

无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

在sql server 2000下收到如下错误:

该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。

[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]

OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

(2.2)解決方案

(2.2.1)双方启动MSDTC服务

MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。

(2.2.2) 打开双方135端口

MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。

(2.2.3)保证链接服务器中语句没有访问发起事务服务器的操作

  在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务服务器