停止執行比方說,我有兩個存儲過程,Outer
和Inner
:如何回滾,並從內部存儲過程
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
存儲過程開始和終止兩Inner
和Outer
所有進一步的處理。
出現這種情況的,而不是我所期望的如上面概括的事情,是我得到的錯誤信息:
在內蒙古:
事務計數後EXECUTE表示 失配數BEGIN和COMMIT語句。先前計= 1,當前計數= 0
在外層:
TRANSACTION請求沒有相應的BEGIN事務的提交。
顯然,即使啓用了XACT_ABORT,ROLLBACK
也不會停止執行流程。在ROLLBACK
之後發出RETURN
聲明使我們脫離Inner
,但Outer
中的執行繼續。我需要做什麼才能使ROLLBACK
停止所有進一步處理並有效地退出Outer
?
感謝您的任何幫助。
我不是100%肯定的,但是如果你在Inner過程中做了RAISERROR而不是回滾呢?我認爲它應該導致調用事務回滾。 – King 2012-07-18 18:06:27
交易保存點 – 2012-07-18 18:17:09
它是否符合我們的要求? – 2012-07-24 16:46:10