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。
服务器: 消息 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。