【问题标题】:Basic template for Transactions in sqlserversql server中事务的基本模板
【发布时间】:2008-11-14 16:33:58
【问题描述】:

如果我简单地用以下方式包装我的查询:

BEGIN TRANSACTION



COMMIT TRANSACTION

如果其中有任何失败,它会自动回滚吗?

通过查看其他代码,他们似乎在检查错误,如果有错误,他们会执行 GOTO 语句,然后调用 ROLLBACK TRANSACTION

但这似乎是一项工作,必须在每次插入/更新后检查 IF(@@ERROR 0)。

【问题讨论】:

    标签: sql-server transactions


    【解决方案1】:

    我通常在我的存储过程中做这样的事情。它使事情保持良好和安全,并传递我遇到的任何错误。

    SET XACT_ABORT ON;
    
    BEGIN TRY
        BEGIN TRANSACTION;
    
        -- Code goes here
    
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;
    
        DECLARE
            @ERROR_SEVERITY INT,
            @ERROR_STATE    INT,
            @ERROR_NUMBER   INT,
            @ERROR_LINE     INT,
            @ERROR_MESSAGE  NVARCHAR(4000);
    
        SELECT
            @ERROR_SEVERITY = ERROR_SEVERITY(),
            @ERROR_STATE    = ERROR_STATE(),
            @ERROR_NUMBER   = ERROR_NUMBER(),
            @ERROR_LINE     = ERROR_LINE(),
            @ERROR_MESSAGE  = ERROR_MESSAGE();
    
        RAISERROR('Msg %d, Line %d, :%s',
            @ERROR_SEVERITY,
            @ERROR_STATE,
            @ERROR_NUMBER,
            @ERROR_LINE,
            @ERROR_MESSAGE);
    END CATCH
    

    【讨论】:

    • 我真的很喜欢这个解决方案。任何关于缺点/缺陷的 cmet ......?
    • 我发现的唯一缺点是确定对事务中引发的错误的最佳响应是什么。此代码将回滚所有打开/待处理的事务(如果您使用嵌套事务),因此在调用您的数据访问层期望能够回滚事务本身的代码时可能会发生奇怪的事情。
    • 用XACT_STATE代替@@TRANCOUNT来判断是否回滚呢?
    【解决方案2】:

    是的,在它不起作用的情况下显式回滚事务很重要。

    我通常告诉我儿子,你只需要刷你想保留的牙齿。

    这种情况下,只需要回滚不想执行的命令即可。

    【讨论】:

      【解决方案3】:

      如果关闭错误,这将自动回滚事务

      SET XACT_ABORT ON
      
      BEGIN TRANSACTION
      -- CODE HERE
      COMMIT TRANSACTION
      

      【讨论】:

        【解决方案4】:

        对于事务控制,您使用开始、提交和回滚。您通过提供 BEGIN TRANSACTION 开始交易。然后你把你需要的各种SQL语句。然后,您通过发出提交或回滚来结束事务。 COMMIT TRANSACTION 将在 BEGIN 语句之后提交您对数据库所做的所有更改,并使其永久化。 ROLLBACK TRANSACTION 将回滚您在 BEGIN 语句之后对数据库所做的所有更改。但是,它不会改变变量值。

        例子:

        BEGIN TRANSACTION
        
        UPDATE table SET column = 'ABC' WHERE column = '123'
        
        COMMIT TRANSACTION
        
        --//column now has a value of 'ABC'
        
        BEGIN TRANSACTION
        
        UPDATE table SET column = 'ABC' WHERE column = '123'
        
        ROLLBACK TRANSACTION
        
        --//column still has it's previous value ('123') No changes were made.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多