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行 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框架,那么我认为可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |