我想从 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 通常会处理此问题。