簡體   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