【问题标题】:SQL Transactions with Commit and Rollback具有提交和回滚的 SQL 事务
【发布时间】:2016-03-07 01:52:37
【问题描述】:

谁能告诉我我对START TRANSACTION 和COMMIT 或ROLLBACK 的使用理解是否正确。

如果我想更新一个表,但希望能够在出现错误时撤消我的更新,那么这段代码是否是正确的方法?

START TRANSACTION;  

update ar 
set doc_no = gltrans.reference  
from plxx.dbo.ar 
inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD
where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
  and ar.DOC_NO <> gltrans.REFERENCE

COMMIT;

【问题讨论】:

  • 您使用的是哪个 DBMS?

标签: sql transactions commit


【解决方案1】:

是的,如果您在启动事务之后和提交语句之前发生错误,该语句中的任何内容都将被回滚。如果您想要一些关于错误管理的附加功能,例如失败的日志记录,您还可以包含 Try/Catch 语句。

【讨论】:

  • 我刚刚犯了一对多的错误,你更新并忘记包含正确的 WHERE 子句,所以你最终更新了整个表/列,我被告知如果你使用有回滚的方法开始/提交,所以正在寻找合适的代码
  • 好的,当您忘记 where 语句时,它不会调用将通过使用事务自动捕获的“错误”。但是,根据您的 DBMS,您可以使用事务日志将数据库回滚到某个时间点。这将取决于您的 DBMS 和某些配置选项,例如表使用的引擎。
  • 如果您担心更新所有行,您可以将更新后的 @@ROWCOUNT 值与表行数进行比较,并结合 try/catch 来回滚,以防它们是一样的。
【解决方案2】:

使用BEGIN TRANSACTION 而不是START TRANSACTION。执行UPDATE命令后,可以使用ROLLBACK回滚,然后使用COMMIT确认事务。

【讨论】:

    【解决方案3】:

    这是我用于在 sql 语句中出现错误时回滚事务的模式:

    http://www.4guysfromrolla.com/webtech/041906-1.shtml

    BEGIN TRY
    BEGIN TRANSACTION    -- Start the transaction
    
    update ar 
    set doc_no = gltrans.reference  
    from plxx.dbo.ar 
    inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD
    where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
    and ar.DOC_NO <> gltrans.REFERENCE
    
     -- If we reach here, success!
    COMMIT
    END TRY
    BEGIN CATCH
    -- Whoops, there was an error
    IF @@TRANCOUNT > 0
     ROLLBACK
    
    -- Raise an error with the details of the exception
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
    SELECT @ErrMsg = ERROR_MESSAGE(),
          @ErrSeverity = ERROR_SEVERITY()
    
    RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2011-10-01
      • 2018-01-02
      相关资源
      最近更新 更多