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