2015-01-21 46 views
0

我想從nservicebus處理程序調用我的MS SQL存儲過程,我不知道我是否還需要使用像NServiceBus處理程序和存儲過程調用。我應該使用SET XACT_ABORT ON還是TRY CATCH?

CREATE PROCEDURE [DBO]。[proc_fd_SomeEntitySyncRawWithStage]

AS BEGIN

BEGIN TRY

BEGIN TRANSACTION

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

COMMIT TRANSACTION;

END TRY BEGIN CATCH

回滾事務;

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

讀取與SET XACT_ABORT相關的文檔時,應將其保留爲ON。從NServiceBus的角度來看,消息處理處理被封裝在一個事務中(根據傳輸可以分發),這意味着每個錯誤都會回滾TX。考慮到我會說BEGIN/END和TRY/CATCH語句不是必需的。不是SQL大師,我真誠地不知道批處理會發生什麼。 – 2015-01-26 16:23:35

回答

0

通常,您應該始終將您的過程調用包裝在事務中,您會使用ORM還是ADO.NET。 WHT ADO.NET你會做類似

var ts = myConnection.BeginTransaction(); 

然後在try-catch塊內調用你的過程。

進一步取決於你的邏輯。如果你的程序可能因某種邏輯而失敗,你需要有一個返回碼並根據這個碼引發異常。如果您的過程僅僅因爲SQL異常而失敗,則try-catch塊將處理它。

在catch塊中,您需要回滾事務。

如果您在catch塊中重新拋出異常,則消息將由FLR重試,如果已配置 - 則由SLR重試。通常,這有助於在數據庫中發生故障時,FLR通常會處理這個問題。

相關問題