1/ 以下代码片段显示了我期望的错误:插入语句与外键约束 FK_... 冲突。
SET XACT_ABORT ON;
BEGIN TRANSACTION
INSERT INTO linkedsrv1.db1.[dbo].tbl1 ([Col1], [Col2])
VALUES (1200, 0)
COMMIT TRANSACTION
2/ 但是当我将其放入BEGIN TRY/CATCH中时,错误消息就变得模糊了:Msg 1206,级别18,状态118,第18行 Microsoft Distributed Transaction Coordinator(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时,仍然不清楚为什么会出现此错误。
如果我在链接服务器上具有多个表中的多个插入,则会收到相同的错误。
欢迎任何评论 / 备注。
FOREIGN KEY constraint FK_
错误可能是由于linkedsrv1.db1.[dbo].tbl1
的列[IdWebsite]
或[IdProductType]
具有外键和值1200或0,而各自的列可能不在它们的主表中...但对于复杂的错误可能是由于某个内部sp调用失败了...最佳实践是不依赖于XACT_STATE()
,而是在处理多级事务时检查@@TRANCOUNT。 - Pranav Singh