回滚并提交事务SQL Server

时间:2014-04-17 18:11:51

标签: sql sql-server sql-server-2008 tsql

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

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

这会有用吗?

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

    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

4 个答案:

答案 0 :(得分:0)

您可以发布您的代码但请注意:

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

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

OPEN CURSOR

CODE...

CLOSE CURSOR

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

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

答案 1 :(得分:0)

此处使用code snippet

        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

答案 2 :(得分:0)

您的代码大致可以正常运行:

OPEN CURSOR
    BEGIN TRANSACTION
        BEGIN TRY
           COMMIT
        END TRY

        BEGIN CATCH
            ROLLBACK
        END CATCH
    END TRANSACTION
CLOSE CURSOR

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

答案 3 :(得分:0)

我没有看到您关注的代码结构有任何问题。你可以修改下面的一些工作。所以最终,如果一切顺利(在TRY内)继续并提交。如果它进入CATCH段,则将其回滚。

我不认为需要检查IF @@TRANCOUNT > 0;因为一切都在交易中,他们将遵守atomicity财产。因此,即便是一个人因某种原因失败了;你应该回滚(没有部分提交)

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

        ROLLBACK
END CATCH