2015-01-21 10 views
0

내가 nservicebus 핸들러에서 내 MS의 SQL 저장 프로 시저를 호출하고 싶은 나는 아직도 PROCEDURE [dbo가]를 만들NServiceBus 처리기 및 저장 프로 시저 호출 SET XACT_ABORT ON 또는 TRY CATCH를 사용해야합니까?

같은 것을 사용할 필요가 궁금. proc_fd_SomeEntitySyncRawWithStage]

AS

시작 BEGIN TRANSACTION BEGIN

TRY

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

COMMIT TRANSACTION;

END 는 CATCH

롤백 트랜잭션을 BEGIN TRY;

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. 명심하십시오 :

"배치 제약 조건 위반과 같은 런타임 문 오류가 발생하는 경우 데이터베이스 엔진의 기본 동작은"

"오류를 생성 한 문만 롤백하는 것입니다

는 "SET XACT_ABORT가 롤백 오류를 제기, 일부의 경우에만 Transact-SQL 문이 OFF 때 트랜잭션 처리를 계속합니다."

+0

SET XACT_ABORT와 관련된 문서를 읽으면 ON으로 설정해야합니다. NServiceBus의 관점에서 볼 때 메시지 처리 처리가 트랜잭션 (전송에 따라 다름)에 래핑되므로 각 오류가 TX를 롤백합니다. BEGIN/END 및 TRY/CATCH 문은 필요 없다고 가정하면됩니다. SQL 전문가가 아니기 때문에 일괄 처리가 어떻게 될지 진심으로 모릅니다. –

답변

0

일반적으로 항상 프로 시저 호출을 트랜잭션으로 래핑해야하며 ORM 또는 ADO.NET을 사용하십시오. Wht ADO.NET 같은 것을 할 것입니다.

var ts = myConnection.BeginTransaction(); 

try-catch 블록 내에서 프로 시저를 호출하십시오.

로직에 따라 다릅니다. 프로 시저가 일부 논리로 인해 실패 할 수있는 경우 리턴 코드가 있어야하고 그에 따라 예외가 발생해야합니다. SQL 예외로 인해 프로 시저가 실패하면 try-catch 블록이 처리합니다.

catch 블록에서 트랜잭션을 롤백해야합니다.

catch 블록에서 예외를 다시 발생 시키면 메시지가 FLR 및 SLR에 의해 구성된 경우 재 시도됩니다. 일반적으로 데이터베이스에 데드락이있을 때 FLR이이를 처리합니다.