sql-server – BEGIN TRY / CATCH和MSDTC错误

前端之家收集整理的这篇文章主要介绍了sql-server – BEGIN TRY / CATCH和MSDTC错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1 /以下代码显示了预期的错误:INSERT语句与FOREIGN KEY约束FK _…冲突.
SET XACT_ABORT ON;

BEGIN TRANSACTION

    INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([Col1],[Col2])  
    VALUES (1200,0)                

COMMIT TRANSACTION

2但是当我把它放在一个BEGIN TRY / CATCH中时,错误消息是模糊的:消息1206,级别18,状态118,第18行
Microsoft分布式事务处理协调器(MS DTC)取消了分布式事务.

SET XACT_ABORT ON;

BEGIN TRY  
    BEGIN TRANSACTION   

        -- Error is on this line
        INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([IdWebsite],[IdProductType])  
        VALUES (1200,0)   

    COMMIT TRANSACTION
END TRY  
BEGIN CATCH
    PRINT 'Error' -- Code not reached

    SELECT ERROR_NUMBER(),ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE()

    IF XACT_STATE() != 0   
        ROLLBACK TRANSACTION
END CATCH

任何想法为什么会发生这种情况?

后来编辑:

>它适用于我删除不需要的显式事务的情况.当我放BEGIN / COMMIT TRAN时我仍然不明白为什么我会收到这个错误.
>我得到相同的错误,以防我在多个表中位于链接服务器上有多个插入.

欢迎任何评论/评论.

解决方法

从MSDN:

症状

请考虑以下情况.您可以使用sql Server 2005中的sql Native Client OLE DB提供程序(sqlNCLI)来创建链接服务器.您创建一个分布式事务.分布式事务包含使用链接服务器从表中检索数据的查询.提交分布式事务时,可能会收到以下错误消息:

Msg 1206,Level 18,State 167,Line 3 
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled 
the distributed transaction.

此外,在发生此行为后运行查询时可能会收到以下错误消息:

Msg 8525,Level 16,State 1,Line 1 
Distributed transaction completed. Either enlist this session in a new 
transaction or the NULL transaction.

如果满足以下条件,则会出现此问题:

You use the sqlNCLI provider to create a linked server between two 
instances of sql Server 2005.

The XACT_ABORT option is set to ON.

In the distributed transaction,you try to release a rowset before 
all rows in the rowset are processed.

注意如果在分布式事务中调用ReleaseRows方法以在应用程序中提交分布式事务之前发布行集,则也可能会出现此问题.

原因

发生此问题的原因是sqlNCLI提供程序错误地向关联的服务器发送注意信号以回滚分布式事务.

替代方法

为了防止sqlNCLI提供商向服务器发送注意信号,请使用sqlNCLI提供程序完全使用OLE DB消费者创建的任何行集.

更新

您需要在服务器参数中将’remote proc trans’配置为“1”.

例如:

exec sp_configure’remote proc trans’,’1′
重新配置与覆盖

这将允许您执行任何分布式查询.

更多更新

如果您在前端使用.Net框架,那么我认为可以使用
TransactionScope课.从查询删除事务,并将事务处理为代码级别.

原文链接:https://www.f2er.com/mssql/82278.html

猜你在找的MsSQL相关文章