“MSSQLSERVER,第1张

“MSSQLSERVER,第2张

前段时间在做一个BizTalk Server 2006项目,在使用SQL Adapter的时候遇到了“分布式事务已经完成”的情况。请在新事务或空事务中登记此会话。

作者使用的操作系统是Windows Server 2003企业版+SP2。数据库管理系统使用SQL Server 2005企业版+SP2。BizTalk Server使用2006企业版,存储过程由BizTalk生成向导转换为Xml架构。在部署时,BizTalk SQL适配器通过指定相应的Xml命名空间来访问存储过程。BizTalk Server和SQL Server部署在不同的服务器上。每个服务器都不在Windows域中,配置每个服务器的MSDTC,将“事务管理器通信”设置为“不需要身份验证”。

我检查了MSDN文档,它属于“MSSQLSERVER_8525”数据库引擎错误。MSDN描述了在什么情况下会遇到“MSSQLSERVER_8525”错误。
将分布式事务处理协调器用于SQL Server的编程模型要求应用程序显式注册分布式事务或从分布式事务中分离。

当满足以下四个条件时,就会出现此错误:
1。应用程序已在分布式事务中登记。
2。不管什么原因,该事务已经结束(提交或回滚)。
3。用户应用程序尚未明确离开分布式事务或在新的分布式事务中注册。
4。应用程序尝试执行现有分布式事务之外或注册到新分布式事务的任何事务操作,如发出查询或启动本地事务。

当应用程序执行创建本地事务的操作时,使用错误状态1,当应用程序尝试注册到绑定会话时,使用状态2。

MSDN解释了相关的用户操作。在分布式事务中注册应用程序后,该应用程序必须从分布式事务中显式分离,或者在另一个分布式事务中注册。这将隐式地从最后注册的事务中分离出来。有关从分布式事务中分离或登记的确切语法,请参考该应用程序的编程接口手册。
有关详细信息,请访问http://technet.microsoft.com/zh-cn/library/bb326310.aspx.

BizTalk SQL适配器访问的SQL Server存储过程的大致内容描述如下:
通过存储过程传入多个参数,将数据更新到指定的数据表,然后通过FOR XML AUTO,ELEMENTS语句将操作的成功或失败结果返回给SQL适配器。对于数据表的更新操作,同事使用“开始TRAN”来启动事务。问题在于存储过程添加的事务。

在BizTalk项目中,作者使用编排来访问SQL适配器。编排设置为“长期事务”,而访问SQL适配器的一些功能块放在一个范围内,这个范围设置为“原子事务”。部署BizTalk应用程序后出现上述错误。

问题解决。由于存储过程是我的同事用SQL 2000的方式编写的,所以笔者首先想到了用SQL Server 2005中T-SQL语句的新功能——try/catch块来代替。TRY CATCH结构类似于C#中的经典结构。有关使用TRY/CATCH的建议,请查看“使用TRY/CATCH语句解决SQL Server 2005的死锁”。

以下是一些SQL片段:
begin try
begin transaction;
-update语句
提交事务;
SET @ ReutrnValue = ' 01 ';
END TRY
BEGIN CATCH
IF @ @ TRANCOUNT > 0
BEGIN
回滚事务;
END
END CATCH;

在存储过程结束时返回XML:
从清单状态清单中选择code作为返回值
其中code = @ reutrnvalue
for xmlauto,elements

简单分析。出现“分布式事务完成”消息。请在新事务或空事务中注册此会话”错误发生在数据库级别,并且在BizTalk Server的业务流程中发起了一个分布式事务,而此分布式事务调用的存储过程只包含它自己的事务。在网上搜索了一下,程序调试时访问SQL Server出现这种错误是相当常见的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » “MSSQLSERVER

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情