[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ] 这个是什么原因啊?

zwx963536 2003-11-12 07:13:27
rt
...全文
173 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-11-12
  • 打赏
  • 举报
回复
你这样建立连接服务器:

EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;'
exec sp_addlinkedsrvlogin @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'
GO

注意启动DTC(分布式事务处理协调器)

过程里加:
set XACT_ABORT on
set ANSI_NULL_DFLT_ON on
set ANSI_WARNINGS on
zwx963536 2003-11-12
  • 打赏
  • 举报
回复
ALTER PROCEDURE st_ExecSQL
(@Ret smallint OUTPUT,
@str1 varchar(600)='*',@str2 varchar(600)='*' ,@str3 varchar(600)='*',
@str4 varchar(600)='*',@str5 varchar(600)='*',@str6 varchar(600)='*')
AS
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
---------------------------------------------------
set @Ret=1
if @str1<> '*' EXEC(@str1)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
set @Ret=2
if @str2<> '*' EXEC(@str2)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
set @Ret=3
if @str3<> '*' EXEC(@str3)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
set @Ret=4
if @str4<> '*' EXEC(@str4)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
set @Ret=5
if @str5<> '*' EXEC(@str5)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
set @Ret=10
if @str6<> '*' EXEC(@str6)
if @@ERROR<>0 GOTO L_ROLLBACK
----------------------------------------------------
COMMIT TRANSACTION
set @Ret=0
return(@Ret)

L_ROLLBACK:
ROLLBACK TRANSACTION
return (@Ret)

上面的就代码,大家帮忙看看
zwx963536 2003-11-12
  • 打赏
  • 举报
回复
我用的是链接服务器!
lvltt 2003-11-12
  • 打赏
  • 举报
回复
楼主参考:

BEGIN DISTRIBUTED TRANSACTION
指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。

语法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]

参数
transaction_name

是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。

@tran_name_variable

是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

有两个方法可将远程 SQL 服务器登记在一个分布式事务中:

分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。


分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。
例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。

分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。

sp_configure remote proc trans 选项控制对本地事务中的远程存储过程调用是否自动使本地事务被提升为由 MS DTC 管理的分布式事务。连接层 SET 选项 REMOTE_PROC_TRANSACTIONS 可用于替代由 sp_configure remote proc trans 建立的服务器默认值。启用本选项后,远程存储过程调用会使一个本地事务提升为分布式事务。创建 MS DTC 事务的连接成为该事务的创建人。COMMIT TRANSACTION 初始化一个 MS DTC 协调的提交。如果启用了 sp_configure remote proc trans 选项,本地事务中的远程存储过程调用将被自动保护,成为分布式事务的一部分,而不需要重写应用程序以便专门使用 BEGIN DISTRIBUTED TRANSACTION 以替代 BEGIN TRANSACTION。

在本地事务中执行一个分布式查询时,如果目标 OLE DB 数据源支持 ItransactionLocal,则该事务被自动提升为分布式事务。如果目标 OLE DB 数据源不支持 ItransactionLocal,则在分布式查询中只允许只读操作。

关于分布式事务环境和处理的更多信息,请参见 Microsoft 分布式事务处理协调器文档。

pengdali 2003-11-12
  • 打赏
  • 举报
回复
远程也要启动DTC(分布式事务处理协调器)
pengdali 2003-11-12
  • 打赏
  • 举报
回复
启动DTC(分布式事务处理协调器)

set XACT_ABORT on
set ANSI_NULL_DFLT_ON on
set ANSI_WARNINGS on

BEGIN DISTRIBUTED TRANSACTION
select * from OPENDATASOURCE('MSDASQL','DRIVER={SQL Server};SERVER=ip;UID=sa;PWD=密码;').pubs.dbo.jobs
commit tran

34,496

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧