NServiceBus 处理程序和存储过程调用.我应该使用设置XACT_ABORT ON还是尝试捕获



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

创建过程 [DBO]。[proc_fd_SomeEntitySyncRawWithStage]

如开始

开始尝试

开始交易

-- Batch of inserts and updates that I want to keep transactional

提交事务;

结束尝试开始捕捉

回滚事务;

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设置为...回滚我的事务的东西,或者 NServiceBus 会在消息处理程序中出现任何 sql 异常时回滚它?

附言请记住:

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

"当 SET XACT_ABORT 关闭时,在某些情况下,只有引发错误的 Transact-SQL 语句才会回滚,事务将继续处理。

通常,您应该始终将过程调用包装在事务中,是使用 ORM 还是 ADO.NET。你会做类似的事情 ADO.NET

var ts = myConnection.BeginTransaction();

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

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

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

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

最新更新