2016-11-19 74 views
1

我有时在以下顺序执行下面的一组语句:回滚和Raiseerror,哪个先?

Raiseerror(...) 
Rollback; 

但如果它导致如下相同的效果我很纳闷:

Rollback; 
Raiseerror(...) 

我知道他们是相同的,原因同样的效果。首先执行回滚,执行后继续执行以下行,即Raiseerrror(...)

任何人都可以证实这一点吗?或者更倾向于以一种混合的方式执行这组声明?

+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