当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server_8525引擎错误怎么办?

MSSQL
SQL Server--全文本检索的应用(一)
SQL 2005的SSIS与Oracle的迁移性能
SQL优化实例:从运行30分钟到运行只要30秒
无法在SQL Server2005 Manger Studio 中录入中文的问题
SQL Artisan多表查询和统计
SQL Server数据库开发人员在应聘时经常被问到哪些问题
一个完整的SQL SERVER数据库全文索引的示例
SQL Server安全之加密术和SQL注入攻击
如何对SQL Server中的tempdb“减肥”
SQL Server 2005升级的十个步骤
如何在SQL Server开发中融入极限编程技术
SQL Server应用程序高级SQL注入(下)
SQL Server应用程序高级SQL注入(上)
SQL Server连接中的常见错误
IIS中SQL Server数据库的安全问题
SQL Server 2005区域配置和安全工具
保护 SQL Server 的十个步骤
如何利用SQL Server 2000的复制选项
SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法
SQL SERVER 2005同步复制技术的应用

MSSQL 中的 SQL Server_8525引擎错误怎么办?


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 102 ::
收藏到网摘: n/a

  这篇文章着重介绍了"SQL Server_8525"SQL Server数据库引擎错误的解决方法,更多内容请参考下文:

前段时间笔者在做一个BizTalk Server 2006的项目,使用SQL Adapter时碰到“分布式事务已完成。请将此会话登记到新事务或 NULL 事务中”的错误。

笔者使用的操作系统为Windows Server 2003企业版 + SP2。数据库管理系统使用SQL Server 2005企业版 + SP2。BizTalk Server 使用2006企业版,通过BizTalk生成项向导转换存储过程为Xml Schema,在部署的时候由BizTalk SQL Adapter通过指定对应Xml Namespace来访问该存储过程。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适配器。对于数据表的更新操作上同事使用“BEGIN TRAN”来开启一个事务。问题就出在存储过程添加的事务上。

在BizTalk项目中,笔者使用了Orchestration来访问SQL适配器,对于Orchestration的设置为“长期事务”,而访问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;

--更新语句

COMMIT TRANSACTION;

SET @ReutrnValue = '01';

END TRY

BEGIN CATCH

IF @@TRANCOUNT > 0

BEGIN

ROLLBACK TRANSACTION;

END

END CATCH;

在存储过程的最后返回XML:

SELECT Code AS ReturnValue FROM ManifestStatus Manifest

WHERE Code = @ReutrnValue

FOR XML AUTO,ELEMENTS

结果对于单条数据的处理不会再出现该提示,不过对于并发执行过程中,发现有死锁回滚现象。可能语句的其它地方写的有问题。

简单分析。出现“分布式事务已完成。请将此会话登记到新事务或 NULL 事务中”错误是在数据库这一层处理出现,在BizTalk Server 的业务流程中发起了一个分布式事务,而该分布式事务调用的存储过程刚好又包含有自己的事务,那该事务就变成了内嵌事务。在出现DeadLock的情况下,会RollBACK所有事务。在网上搜索了一下,在程序调试过程中访问SQL Server出现该错误还是比较常见。