2012-07-18 35 views
0

停止執行比方說,我有兩個存儲過程,OuterInner如何回滾,並從內部存儲過程

CREATE PROCEDURE dbo.Outer 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    BEGIN TRAN 
    EXEC Inner 

    -- Perform additional processing (which should not occur if there is 
    -- a ROLLBACK in Inner) 
    ... 
    COMMIT 
END; 
GO 

Outer存儲過程打開XACT_ABORT並啓動一個顯式事務。然後它調用事務內的Inner存儲過程。

CREATE PROCEDURE dbo.Inner 
AS 
BEGIN 
    DECLARE @Id INT=(SELECT Id FROM SomeTable WHERE ...); 

    IF (@Id IS NOT NULL) 
    ROLLBACK; 

    INSERT INTO SomeTable(...) 
    VALUES (...); 
END; 
GO 

Inner存儲過程進行檢查,看看是否有存在,如果它要回滾整個事務中Outer存儲過程開始和終止兩InnerOuter所有進一步的處理。

出現這種情況的,而不是我所期望的如上面概括的事情,是我得到的錯誤信息:

在內蒙古:

事務計數後EXECUTE表示 失配數BEGIN和COMMIT語句。先前計= 1,當前計數= 0

在外層:

TRANSACTION請求沒有相應的BEGIN事務的提交。

顯然,即使啓用了XACT_ABORT,ROLLBACK也不會停止執行流程。在ROLLBACK之後發出RETURN聲明使我們脫離Inner,但Outer中的執行繼續。我需要做什麼才能使ROLLBACK停止所有進一步處理並有效地退出Outer

感謝您的任何幫助。

+1

我不是100%肯定的,但是如果你在Inner過程中做了RAISERROR而不是回滾呢?我認爲它應該導致調用事務回滾。 – King 2012-07-18 18:06:27

+0

交易保存點 – 2012-07-18 18:17:09

+0

它是否符合我們的要求? – 2012-07-24 16:46:10

回答

0

您必須實現Exception Handling

Begin Try 
    Set NOCOUNT ON 
    SET XACT_ABORT ON 
    Begin Tran 
     --Your Code 
    Commit Tran 
End Try 

Begin Catch 
    Rollback Tran 
End Catch 
1

發行回滾不會中止批次(無論XACT_ABORT設置)。如果在嚴重程度較高的情況下拋出錯誤 - 系統或通過RAISERROR生成自定義,批處理將自動中止您的案例。