分布式事务已完成。请将此会话登记到新事务或 NULL 事务中

解决方法:

1、查看参与事务范围中的各相关服务器(譬如中间层服务器、数据库服务器、可能还有链接服务器)的MSDTS的入站、出站选项是否都已设置为“允许”;如下图

2、数据库端代码(通常是存储过程、触发器)的开头是否设置了XACT_ABORT选项,如下代码:

SET XACT_ABORT ON;

另:关于存储过程常用的几个选项用途

SET NOCOUNT ON/OFF:当SET NOCOUNT为ON时,不返回计数(执行完后会返回SQL影响行数),此时将不会;当设置为OFF时,返回计数。 如果存储过程中包含的SQL语句并不返回许多实际的数据,可以将之设为ON,可以大量减少网络流量,而可显著提高性能。

SET XACT_ABORT ON/OFF: 当SET XACT_ABORT为ON时,如果执行Transact-SQL语句出错时,会立即停止执行,并回滚数据; 当设为OFF时,有时只回滚产生错误的SQL语句,而事物将继续处理,如果错误很严重,那么即使设置为OFF,也会回滚整个事务,OFF是默认设置。 编辑错误或语法错误,将不设XACT_ABORT的影响。

对于大多数 OLE DB 访问接口(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。

SET TRANCACTION ISOLATION LEVEL READ UNCOMMITTED/COMMITTED: 此为设置一个事务的隔离级别,一次只能设置一个隔离级别选项,并且始终对那个连接有效,直到显示更改设置选项。 事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。

当属性设为UNCOMMITTED时,指定语句可以读取已有其他事务修改而未提交的行;设置此选项之后,可以读取未提交的修改,这种读取称为脏读。在事务结束之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。 当属性设为COMMITTED时,指定语句不能读取已有其他事务修改而未提交的行,这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是 SQL Server 的默认设置。

posted @ 2012-05-12 13:44  Chr☆s  阅读(6884)  评论(0编辑  收藏  举报