轉自: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