我有一個MSSSQL存儲過程執行的分佈式事務處理看起來是這樣的:檢查Contraint繞過CATCH塊在分佈式事務處理
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
這工作得很好。
如果我添加這3插入語句:
insert into LNKSRV.INST.dbo.zz (id, val) values ('error', 'b');
...它正確地失敗 - 事務回滾遠程服務器上,並控制傳遞到catch塊,我得到有關該錯誤信息(不能將'錯誤'轉換爲int)。
但如果我添加此插入語句:
insert into LNKSRV.INST.dbo.zz (id, val) values (-1, 'b');
..和我有需要> 0的ID列值的遠程表的檢查contraint,那麼事情不會如我所料工作。交易DOERS回滾,但控制不是轉移到catch塊。相反,執行就會死亡,並將其打印到輸出窗口:
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction
爲什麼?我需要在catch博客中記錄這些錯誤。
所以你的答案是,「我搞砸了」? : - | – Clyde 2009-02-13 18:57:05