drop procedure OuterPro
go
create procedure OuterPro
as
begin
  declare 
    @a int,
    @b int
  begin tran
    set @a=1
    set @b=2
    declare @c int 
    set @c=@a+@b
    print 'c is :' +convert(varchar(2),@c)

    exec InnerPro 0

    if @@error <>0
    begin
      print 'before rollback'
      rollback tran
      print 'OuterPro find InnerPro error'
    end

     declare @s int 
     set @s=@a*@b
     print 's is :'+convert(varchar(2),@s)

  commit tran
   
end
go

drop Procedure InnerPro
go
create Procedure InnerPro
  @c int
as 
begin
  declare
  @d int ,
  @e int
  set @d=100
  
  set @e=@d/@c
  
  if @@error <>0
  print 'innerPro error'
  else
  print @e

end 
go
exec OuterPro
输出结果: c is :3服务器: 消息 8134,级别 16,状态 1,过程 InnerPro,行 10遇到被零除错误。innerPro errors is :2
 
  修改 InnerPro:
 
drop Procedure InnerPro
go
create Procedure InnerPro
@c
int
as
begin
declare
@d
int ,
@e
int
set @d=100
begin tran tran_innner
set @e=@d/@c

if @@error <>0
begin
print
'innerPro error'
rollback tran tran_innner
print
'innerPro is rollbacked '
end
else
print @e

end
go
调用:exec OuterPro
输入结果:
c is :3
服务器: 消息 8134,级别 16,状态 1,过程 InnerPro,行 10
遇到被零除错误。
innerPro error
服务器: 消息 6401,级别 16,状态 1,过程 InnerPro,行 15
无法回滚 tran_innner。没有找到任何该名称的事务或保存点。
innerPro is rollbacked
服务器: 消息 266,级别 16,状态 2,过程 InnerPro,行 65535
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 1,当前计数 = 2。
before rollback
OuterPro find InnerPro error
s is :2
服务器: 消息 3902,级别 16,状态 1,过程 OuterPro,行 27
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
 
posted on 2011-03-30 17:04  佐伊凡  阅读(341)  评论(0编辑  收藏  举报