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

时间:2015-01-21 08:14:28

标签: sql-server transactions nservicebus rollback

我想从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语句并且事务继续处理。”

1 个答案:

答案 0 :(得分:0)

通常,您应该始终将过程调用包装在事务中,是否使用ORM或ADO.NET。对于ADO.NET,您可以执行类似

的操作
var ts = myConnection.BeginTransaction();

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

还取决于你的逻辑。如果您的过程因某些逻辑而失败,则需要返回代码并根据该异常抛出异常。如果您的过程因SQL异常而失败,则try-catch块将处理它。

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

如果您在catch块中重新抛出异常,FLR将重试该消息,如果已配置 - 由SLR重试。通常,这有助于在数据库中使用deadlicks时,FLR通常会处理此问题。