【发布时间】:2010-10-07 12:03:11
【问题描述】:
我有一个 MSSSQL 存储过程执行分布式事务,如下所示:
SET XACT_ABORT ON;
SET NOCOUNT ON;
BEGIN TRY
BEGIN DISTRIBUTED TRANSACTION
insert into LNKSRV.INST.dbo.zz (id, val) values (1, 'a');
insert into LNKSRV.INST.dbo.zz (id, val) values (2, 'b');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
if (XACT_STATE() <> 0)
BEGIN
ROLLBACK TRANSACTION;
END
print ERROR_MESSAGE();
print ERROR_LINE();
print ERROR_SEVERITY();
END CATCH
这很好用。
如果我添加第三条插入语句:
insert into LNKSRV.INST.dbo.zz (id, val) values ('error', 'b');
...它正确失败了——事务在远程服务器上回滚,控制权传递给 CATCH 块,我得到了有关错误的信息(无法将 'error' 转换为 int)。
但是如果我添加这个插入语句:
insert into LNKSRV.INST.dbo.zz (id, val) values (-1, 'b');
..我在远程表上有一个检查约束,要求 id 列中的值 > 0,然后事情就不像我预期的那样工作。事务DOES 回滚,但控制DOES NOT 转移到catch 块。相反,执行会终止,并打印到输出窗口:
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction
为什么?我需要在 catch 博客中记录这些错误。
【问题讨论】:
标签: sql-server tsql error-handling transactions distributed-transactions