首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在分布式tx失败时检索错误码和消息?(MS DTC)

如何在分布式tx失败时检索错误码和消息?(MS DTC)
EN

Stack Overflow用户
提问于 2012-12-10 22:30:29
回答 1查看 1.9K关注 0票数 0

我们有一个存储过程,它通过具有不同MS SQL 2008数据库的链接服务器启动分布式事务。

我们使用

代码语言:javascript
运行
复制
  SET XACT_ABORT ON;

而且还

代码语言:javascript
运行
复制
  BEGIN TRY / CATCH blocks

绕过事务以捕获任何错误,并将错误代码和消息返回给调用客户端。

但是,当分布式事务内部的命令失败时,似乎是MS DTC接管了控制权,我们的catch块不能“优雅地”回滚并返回错误消息等。相反,会引发一个错误: Microsoft分布式事务协调器(MS DTC)已经取消了分布式事务。

有没有办法通过catch块来捕获这样的分布式tx错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-11 00:29:01

-更新

看起来这是一个已知的问题,微软不打算解决它:http://connect.microsoft.com/SQLServer/feedback/details/414969/uncatchable-error-when-distributed-transaction-is-aborted

有一种解决方法,但使用SSIS调用SP:http://social.msdn.microsoft.com/Forums/en/sqlnetfx/thread/02e43cad-ac11-45fa-9281-6b4959929be7

您应该能够使用XACT_STATE()回滚事务,并结合使用RAISERROR和@@ERROR来提供更多详细信息

SET NOCOUNT ON SET XACT_ABORT ON BEGIN TRY BEGIN TRANSACTION

..code在这里

提交事务;

结束尝试

开始捕捉

声明@errormsg VARCHAR(MAX) SET @errormsg = @@ERROR --测试XACT_STATE:--如果为1,则事务是可提交的。--如果为-1,则事务不可提交,应--回滚。-- XACT_STATE =0表示没有事务,-- commit或rollback操作将生成错误。--测试事务是否不可提交。IF (XACT_STATE()) = -1 BEGIN ROLLBACK TRANSACTION;END;--测试事务是否可提交。IF (XACT_STATE()) =1 BEGIN COMMIT TRANSACTION;END;RAISERROR(@errormsg,16,1)

END CATCH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13802947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档