SQL Server 无法向 Microsoft 分布式事务处理协调器(MS DTC)注册为此事务的资源管理器

时间:2021-12-03 23:59:15
最近做分布式事务处理遇到的问题

程序样例: 
set xact_abort ON  

BEGIN   DISTRIBUTED   TRANSACTION 

insert into [AA].[Test].DbUser.tBMType(Uid,Name,Description,BasePrize,Status) 
select Uid,Name,Description,BasePrize,0 as Status 
from 
(select Uid,Name,Description,BasePrize from [BB].[Test].DbUser.tBMType where Status=1 
union 
select A.Uid,A.Name,A.Description,A.BasePrize from DbUser.tBMType A left outer join [AA].[Test].DbUser.tBMType B on A.Uid=B.Uid where A.Status=2 and B.Uid is null) A 

 if @@error=0 
        COMMIT TRANSACTION 
     else 
        ROLLBACK TRANSACTION 

set xact_abort OFF 


如果正常执行的话,一切OK,但一旦出现异常,以后执行就总抛出这个异常: 
0x8004d00e(XACT_E_NOTRANSACTION)。SQL Server 无法向 Microsoft 分布式事务处理协调器(MS DTC)注册为此事务的资源管理器。客户端或资源管理器可能已停止该事务。 


详细一点来说就是如果两端数据都正常的话,操作是正常的 

接着,我故意制造一个错误 
程序抛出意料中异常 
"不能在具有唯一索引 'Index_ClientUid' 的对象 'DbUser.tClientType' 中插入重复键的行。" 

然后,我再执行一次就永远都是这个错误了: 
"登记操作失败: 0x8004d00e(XACT_E_NOTRANSACTION)。SQL Server 无法向 Microsoft 分布式事务处理协调器(MS DTC)注册为此事务的资源管理器。客户端或资源管理器可能已停止该事务。" 


运行环境:windows 2003 Server、windows xp sp2 
MS Sqlserver 2005 
两端的链接服务器、MSDTC配置均已配置正常,用dtcping工具测试通过 
系统host文件也已加入IP机器映射

7 个解决方案

#1


http://support.microsoft.com/kb/949298/zh-cn

你看下吧
可能对你有帮助

#2


要解决此问题, 请按照下列步骤:1. 下载, 然后安装 Microsoft SQL Server 2005 Service Pack 2。 有关如何获取 SQL Server 2005 Service Pack 2, 请单击下列文章编号以查看 Microsoft 知识库中相应: 
913089 (http://support.microsoft.com/kb/913089/) 如何获取最新服务包对于 SQL Server 2005  
2. 下载, 然后安装最新累积更新 SQL Server 2005 Service Pack 2。 有关如何获取最新累积程序包用于 SQL Server 2005 Service Pack 2, 请单击下列文章编号以查看 Microsoft 知识库中相应: 
937137 (http://support.microsoft.com/kb/937137/) SQL Server 2005 生成发布已发布 SQL Server 2005 Service Pack 2 后  

回到顶端

替代方法
要解决此问题, 对于 SQLServer 的实例打开跟踪标志 4618 BizTalk 数据库宿主。 要这样做, 请按照下列步骤操作:1. 单击 开始 , 单击 运行 , 类型 sqlservermanager.msc然后单击 确定 。 
2. 单击 SQL Server 2005 服务 。 
3. 右击 SQLServer ( InstanceName )然后单击 属性 。 
4. 在 高级 选项卡, 上 启动参数 框中现有字符串末尾键入 -T4618然后单击 确定 。 
5. 重新启动 SQLServer 服务。 

回到顶端

更多信息
要解决此问题, 针对的 SQLServer 实例运行以下命令: BizTalk 数据库宿主SELECT SUM(single_pages_kb + multi_pages_kb) AS 
   "CurrentSizeOfTokenCache(kb)" 
   FROM sys.dm_os_memory_clerks 
   WHERE name = 'TokenAndPermUserStore' 
如果再次, 运行命令时返回值增加您可能遇到 " 原因 " 一节中列出 Microsoft 知识库文章中介绍的问题之一。 指向这些文章确定, 您遇到问题。




#3


帮顶。

#4


打SP2补丁

#5


试过kk19840210提供的方法了,但还是不行,出现一样的情况.郁闷......

#6


打了sp2补丁还是不行,比较郁闷,呵呵

#7


打了sp2补丁还是不行,比较郁闷

#1


http://support.microsoft.com/kb/949298/zh-cn

你看下吧
可能对你有帮助

#2


要解决此问题, 请按照下列步骤:1. 下载, 然后安装 Microsoft SQL Server 2005 Service Pack 2。 有关如何获取 SQL Server 2005 Service Pack 2, 请单击下列文章编号以查看 Microsoft 知识库中相应: 
913089 (http://support.microsoft.com/kb/913089/) 如何获取最新服务包对于 SQL Server 2005  
2. 下载, 然后安装最新累积更新 SQL Server 2005 Service Pack 2。 有关如何获取最新累积程序包用于 SQL Server 2005 Service Pack 2, 请单击下列文章编号以查看 Microsoft 知识库中相应: 
937137 (http://support.microsoft.com/kb/937137/) SQL Server 2005 生成发布已发布 SQL Server 2005 Service Pack 2 后  

回到顶端

替代方法
要解决此问题, 对于 SQLServer 的实例打开跟踪标志 4618 BizTalk 数据库宿主。 要这样做, 请按照下列步骤操作:1. 单击 开始 , 单击 运行 , 类型 sqlservermanager.msc然后单击 确定 。 
2. 单击 SQL Server 2005 服务 。 
3. 右击 SQLServer ( InstanceName )然后单击 属性 。 
4. 在 高级 选项卡, 上 启动参数 框中现有字符串末尾键入 -T4618然后单击 确定 。 
5. 重新启动 SQLServer 服务。 

回到顶端

更多信息
要解决此问题, 针对的 SQLServer 实例运行以下命令: BizTalk 数据库宿主SELECT SUM(single_pages_kb + multi_pages_kb) AS 
   "CurrentSizeOfTokenCache(kb)" 
   FROM sys.dm_os_memory_clerks 
   WHERE name = 'TokenAndPermUserStore' 
如果再次, 运行命令时返回值增加您可能遇到 " 原因 " 一节中列出 Microsoft 知识库文章中介绍的问题之一。 指向这些文章确定, 您遇到问题。




#3


帮顶。

#4


打SP2补丁

#5


试过kk19840210提供的方法了,但还是不行,出现一样的情况.郁闷......

#6


打了sp2补丁还是不行,比较郁闷,呵呵

#7


打了sp2补丁还是不行,比较郁闷