“MSSQLSERVER_8525”SQL Server数据库引擎讹谬作者:郑佐日期:2007-8-31前段工夫笔者在做一个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的措施来写的bin.kabincn.org,笔者第一想到的即方便用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 TRYBEGIN CATCH
IF @@TRANCOUNT > 0 BEGIN ROLLBACK TRANSACTION; ENDEND CATCH;在存储过程的最后归来XML:
SELECT Code AS ReturnValue FROM ManifestStatus
Manifest WHERE Code = @ReutrnValueFOR XML
AUTO,ELEMENTS收获对于单条数据的处理不会再揭示该提醒,不过对于并发施征途序中,觉察有死锁回滚假象。可能语句的其它地方写的有问题。容易分析。揭示“散布式事务已告终。请将此会话登记到新事务或
NULL 事务中”讹谬是在数据库这一层处理揭示,在BizTalk Server
的业务流程中发动了一个散布式事务,而该散布式事务调用的存储过程刚好又包括有自己的事务,那该事务就变成了内嵌事务。在揭示DeadLock的情形下,会RollBACK所有事务。在网上搜查了一下,在过程调试过程中拜会SQL
Server揭示该讹谬还是比拟常见。混杂度当然是相对的,但当我们面对,
PHP strreplace() 函数实例教程
模板措施形式(Template Method)-定义一个垄断中的算法的骨架,而将一些环节推迟到子类中。模板措施使得子类能够不改换一个算法的构造即可重定义该算法的某些特定环节。
<!-- 正文结束 -->