我想从nservicebus处理程序调用我的ms sql存储过程,我想知道我是否还需要使用像
这样的东西CREATE PROCEDURE [dbo]。[proc_fd_SomeEntitySyncRawWithStage]
AS BEGIN
开始尝试
BEGIN TRANSACTION
-- Batch of inserts and updates that I want to keep transactional
COMMIT TRANSACTION;
结束 BEGIN CATCH
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
END CATCH; END
我真的需要所有这些TRY BEGIN TRAN ... CATCH ROLLBACK ..或SET XACT_ABORT ON ...东西来回滚我的事务,或者NServiceBus会在消息处理程序中出现任何sql异常的情况下回滚它吗?
P.S。 请记住:
“如果批处理中发生运行时语句错误(例如违反约束),则数据库引擎中的默认行为是仅回滚生成错误的语句”
和
“当SET XACT_ABORT为OFF时,在某些情况下,只会回滚引发错误的Transact-SQL语句并且事务继续处理。”
答案 0 :(得分:0)
通常,您应该始终将过程调用包装在事务中,是否使用ORM或ADO.NET。对于ADO.NET,您可以执行类似
的操作var ts = myConnection.BeginTransaction();
然后在try-catch块中调用您的过程。
还取决于你的逻辑。如果您的过程因某些逻辑而失败,则需要返回代码并根据该异常抛出异常。如果您的过程因SQL异常而失败,则try-catch块将处理它。
在catch块中,您需要回滚事务。
如果您在catch块中重新抛出异常,FLR将重试该消息,如果已配置 - 由SLR重试。通常,这有助于在数据库中使用deadlicks时,FLR通常会处理此问题。