SQL Server 2008 R2事务是必需的@@ error并且需要ROLLBACK TRANS

Mil*_*les 2 sql transactions sql-server-2008 sql-server-2008-r2

我的同事在程序中有这个:

BEGIN TRAN
 --Some deletes and inserts
IF(@@error <> 0)
BEGIN
  ROLLBACK TRAN
  RETURN
END
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

我在存储过程中有另一个只是:

BEGIN TRANSACTION
  --Some deltes and inserts
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我已经测试过并发现我的程序总是在错误期间(例如更改列数据类型等测试)回滚所有内容而不显式编码回滚.此外,我已经了解到@@errorSQL Server 2005及更高版本的使用条件已过时.

您认为为SQL Server 2008 R2及更高版本执行事务的正确方法是什么?谢谢

mar*_*c_s 12

是的,这ROLLBACK是必要的!

我将基于此模板为SQL Server 2005及更高版本执行存储过程:

BEGIN TRANSACTION
BEGIN TRY

    -- put your T-SQL commands here    

    -- if successful - COMMIT the work
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    -- handle the error case (here by displaying the error)
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage

    -- in case of an error, ROLLBACK the transaction    
    ROLLBACK TRANSACTION

    -- if you want to log this error info into an error table - do it here 
    -- *AFTER* the ROLLBACK
END CATCH
Run Code Online (Sandbox Code Playgroud)

  • +1只是一个注释,你应该在*回滚之后执行log*,否则你也会将写回滚回到日志表.:-) (4认同)
  • 如果你这样做的话,@贾维斯会更加明确和自我记录.您还应该使用`SET XACT_ABORT`设置来查看不同的行为(有关错误处理的完整背景,请参阅[Erland Sommarskog网站上的这些页面](https://www.google.com/search?q=error+ handlingn + XACT_ABORT +站点%3Asommarskog.se)).这里的根本问题是你要避免输入`ROLLBACK TRANSACTION;`? (3认同)