2016-11-19 6 views
1

는 가끔 다음과 같은 순서로 문장의 다음 세트를 수행 나는 그들이 동일과 원인을 이해롤백 및 Raiseerror, 먼저?</p> <pre><code>Raiseerror(...) Rollback; </code></pre> <p>하지만이 같은 아래와 같은 효과의 원인이 있는지 궁금 오전 : :

Rollback; 
Raiseerror(...) 

을 같은 효과. 롤백을 먼저 수행하면 실행 후 Raiseerrror (...)

누구든지이를 확인할 수 있습니까? 또는 concret 방식으로이 명령문 세트를 실행하는 것이 더 좋습니다.

+0

같은 것이 너무 오류의 심각도에 따라 다릅니다. "결과 집합에 둘 이상의 행이 있습니다"와 같은 사용자 정의 오류가 발생하는 경우 서버 오류가 아니라 단지 오류가 발생하면 오류가 발생하지 않도록 롤백해야 할 수 있습니다. 잡으려고 해. – scsimon

답변

2

TRY-CATCH 블록에 있다면 raiserror가 실행을 catch 블록으로 돌리므로 롤백이 try 블록 내에서 발생하면 실행되지 않습니다.

또한 심각도에 따라 다르지만 심각도 20+는 데이터베이스 연결을 종료합니다. 사용

좋은 패턴은

begin try 
    begin transaction; 

    -- do stuff 

    commit transaction; 
end try 
begin catch 
    declare @ErrorMessage nvarchar(max), 
     @ErrorSeverity int, 
     @ErrorState int; 

    select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); 

    if @@trancount > 0 
     rollback transaction; 

    raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState); 
end catch