首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NServiceBus处理程序和存储过程调用。我应该使用SET XACT_ABORT ON还是尝试CATCH?

NServiceBus处理程序和存储过程调用。我应该使用SET XACT_ABORT ON还是尝试CATCH?
EN

Stack Overflow用户
提问于 2015-01-21 16:14:28
回答 1查看 270关注 0票数 0

我想从nservicebus处理程序调用我的ms sql存储过程,我想知道我是否仍然需要使用类似这样的东西。

创建过程dbo.proc_fd_SomeEntitySyncRawWithStage

AS BEGIN

开始尝试

开始事务

代码语言:javascript
复制
-- Batch of inserts and updates that I want to keep transactional

提交事务;

结束尝试开始捕捉

回滚事务;

代码语言:javascript
复制
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();


RAISERROR (@ErrorMessage, 
           @ErrorSeverity, 
           @ErrorState
           );

结束捕捉;结束

我真的需要所有这些尝试开始转换...捕获回滚..或将XACT_ABORT设置为打开...如果消息处理程序中出现任何sql异常,回滚我的事务的东西或NServiceBus会回滚它吗?

附注:记住:

如果批处理中出现运行时语句错误(如违反约束),则数据库引擎中的默认行为是仅回滚生成错误的语句

如果SET XACT_ABORT处于OFF状态,则在某些情况下,仅回滚引发错误的Transact-SQL语句,事务将继续处理。

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 17:54:50

通常,你应该总是将你的过程调用包装在一个事务中,你会使用ORM还是ADO.NET。

代码语言:javascript
复制
var ts = myConnection.BeginTransaction();

然后在try-catch块中调用您的过程。

进一步取决于您的逻辑。如果你的过程可能因为某些逻辑而失败,你需要有一个返回码,并基于此抛出一个异常。如果您的过程因SQL异常而失败,try-catch块将处理它。

在catch块中,您需要回滚事务。

如果在catch块中重新抛出异常,消息将由FLR重试,如果已配置,则由SLR重试。通常,当数据库中有死锁时,这会很有帮助,FLR通常会处理这个问题。

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

https://stackoverflow.com/questions/28062420

复制
相关文章

相似问题

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