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