繁体   English   中英

回滚和提交事务 SQL Server

[英]Rollback and commit transaction SQL Server

我有一个脚本,它声明了几个临时表,并有游标循环遍历每个项目,然后执行更新。 但是,我想为此添加回滚,以防脚本中的任何内容失败,它可以回滚,否则提交。

我将如何做到这一点? 我已经查看了与此相关的其他问题,但我仍然感到困惑。 谢谢。

这行得通吗?

    BEGIN TRY
    BEGIN TRANSACTION 
        ----sql statements ---
        --- inserts-----
        ---- updates -----
    COMMIT
END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

您可以发布您的代码,但让我们看看:

如果我理解正确,如果您的查询运行没有任何错误,您想提交,如果发生任何错误,您想回滚对吗?

您正在使用 Cursor,您可以在脚本中打开和关闭游标,您可以执行以下操作:

OPEN CURSOR

CODE...

CLOSE CURSOR

COMMIT /*it just will commit  if your script runs without errors.*/

如果失败,您不会丢失数据。

这是一个要使用的代码片段

        SET XACT_ABORT ON;

        BEGIN TRY
                BEGIN TRANSACTION
                -- Your script here

                COMMIT TRANSACTION
        END TRY
        BEGIN CATCH
                IF XACT_STATE() != 0   
                        ROLLBACK TRANSACTION

                -- Re-throw error here                    
        END CATCH

粗略地说,您的代码可以正常工作:

OPEN CURSOR
    BEGIN TRANSACTION
        BEGIN TRY
           COMMIT
        END TRY

        BEGIN CATCH
            ROLLBACK
        END CATCH
    END TRANSACTION
CLOSE CURSOR

但是,为什么要使用游标? 据我所知,游标在性能方面执行缓慢,一旦您的事务失败并回滚,游标中的所有事务都将回滚。 CMIWW。

我认为您遵循的代码结构没有任何问题。 您可以像下面那样修改一下,这将起作用。 所以最终,如果一切顺利(在TRY内)继续提交。 如果它进入CATCH段,则将其回滚。

我认为不需要检查IF @@TRANCOUNT > 0 因为一切都在事务中,所以他们将遵守atomicity属性。 因此,即使是单个失败也出于某种原因; 你应该回滚(没有部分提交)

    BEGIN TRY
    BEGIN TRANSACTION 
        ----sql statements ---
        --- inserts-----
        ---- updates -----
    COMMIT
END TRY
BEGIN CATCH

        ROLLBACK
END CATCH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM