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课.从查询删除事务,并将事务处理为代码级别.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...