不能在 INSERT-EXEC 語句內部使用 ROLLBACK 語句 的解決辦法

轉自:http://www.6ideas.cn/ArtF/40334_91.html

兩個存儲過程test1和test2,在TEST1的事務裏面調用TEST2(EXEC TEST2),TEST2裏面也有事務,當TEST2裏面的事務執行ROLLBACK時,就會報錯
“消息
3915,級別 16,狀態 0,過程 IMS_TJZZJYJEQ1,第 100 行,不能在 INSERT-EXEC 語句內部使用 ROLLBACK 語句。”,
原因是運行到存儲過程TEST2時,有兩個事務,當執行ROLLBACK時就會出錯,因爲TEST2是通過EXEC的方式執行的。

CREATE PROC p1
AS
   
-- 初始化事務和返回值設置
    DECLARE
       
@Trancount int,
       
@re int
   
SELECT
       
@re = 0,
       
@Trancount = @@ROWCOUNT
   
   
-- 如果外層(調用者)無事務, 則直接開啓事務, 否則保存事務點(這樣後面可以根據情況做事務處理)
    IF @Trancount = 0
       
BEGIN TRAN
   
ELSE
       
SAVE TRAN TRAN_Save_Point

   
---.... 你的處理
    -- 在可能出錯的語句後面應該包括類似這樣的錯誤處理語句
    IF @@ERROR <> 0
       
GOTO lb_Error


-- 成功提交事務
lb_Succeed:   
   
IF @Trancount = 0
       
COMMIT TRAN
   
GOTO lb_Return

-- 失敗回滾事務
lb_Error:
   
IF @Trancount = 0
       
ROLLBACK TRAN
   
ELSE
       
ROLLBACK TRAN TRAN_Save_Point
   
SET @re = -1

-- 退出處理
lb_Return:
   
RETURN @re

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章