有两个存储过程 p_in,p_out,在存储过程p_out中调用P_increate procedure p_in
as
declare @err int
set @err
begin tran t_in
insert into table_A(....) values(...)
if @@error<>0
begin
set @err=-1
rollback
goto finish
end
commit tran t_in
Finish:
return @err
 
create procedure p_out
as
decalre @err int
set @err
begin tran t_out
exec @err=p_in ...
if @err<>0
begin
rollback
goto finish
end
commit tran t_out
finish:
return @err如果p_in执行错误,也就是执行p_in后返回的@err<>0,那么就会报
“EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 1,当前计数 = 0。”
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
这是什么原因造成的

解决方案 »

  1.   

    为什么要嵌套呢?
    可以只用P_in里面的trans就可以了。
      

  2.   

    trans一般来说是不能嵌套的,应该只在最外层的函数中加上trans就可以了,里面的函数的trans全部拿掉。
      

  3.   

    ??sqlserver是支持事务嵌套吗?
      

  4.   


    你参考一下这两篇文章:
    http://www.cnblogs.com/kymo/archive/2008/05/14/1194161.html
    http://blog.zje.net.cn/u/153/archives/2009/2408.html
      

  5.   

    谢谢蝈蝈,我已经googole过了。但是我对于这个问题还是无法理解。
      

  6.   

    把ROLLBACK 后都加上相应的trans名称试试,如:ROLLBACK TRANSACTION OUTERTRAN
      

  7.   

    好像不行,因为rollback会自动rollback当前的事务
      

  8.   

    sql server 嵌套事务中的所有“事务”都处于一个事务作用域中(与最外层的事务一致),因此只有最外层嵌套的 COMMIT TRAN 语句才会真正提交在它之前的所有事务,而无论在哪一层事务上执行一个 ROLLBACK TRAN 语句都会回滚在它之前的所有事务。因此,在存储过程中最好不要定义显式事务,而是要在执行过程时使用显式事务。
      

  9.   

    你嵌套在里层的存储过程或SQL快是否包含事务回滚或者游标?