存储过程调用中事务嵌套时发生回滚时,如何控制回滚到上一级而不是最外层事务?
我有几个存储过程作如下定义:
create procedure test1
@ret int output
as
set @ret=-1
begin tran in_test
insert.....
if @@error<>0
roolback tran in_test
else
begin
set @ret=0
commit tran in_test
end
------------------------------
create procedure test2
as
declare @outvalue
set @outvalue=0
begin tran out_test
exec test1 @ret=@outvalue
if ....
else ....
.......
exec ... -------其他类似test1结构的存储过程,其中有的还嵌套存储过程
....
if @outvalue=0
commit tran out_test
else
roolback tran out_test
----------------------------------------------------
目的:
我用@outvalue来传递是否正常结束,一旦有一个存储过程执行过程发生问题,则全部回滚
条件:
1.回答时全部@outvalue值变化的逻辑关系不考虑,仅考虑事务
2.由于test1要单独使用,因此必须使用事务
3.不要解释错误内容,我知道
问题:
当存储过程test1发生回滚时,会报错
服务器: 消息 6401,级别 16,状态 1,过程 test1,行 xx
无法回滚 in_test。没有找到任何该名称的事务或保存点。
服务器: 消息 266,级别 16,状态 2,过程 test1,行 xxx
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 1,当前计数 = 2。
请问如何控制事务使其在回滚后保证EXECUTE 后的事务计数正常