------外层事务
declare @flag int
set @flag=0
declare @successcount int
set @successcount=0
declare @returnvalue int
begin tran t1
while @flag<10
begin
set @flag=@flag+1
--调用内层事务,存储过程
exec @returnvalue= testpro
@flag=@flag
if @returnvalue=1
begin
set @successcount=@successcount+1
end
end
if @successcount>0
begin
commit tran t1
end
else
begin
rollback tran t1
end
---内层事务(存储过程)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE [dbo].[testpro]
(
@flag int
)
AS
BEGIN
declare @trancount int
set @trancount= @@trancount
print @trancount
if @trancount>0
begin
--如果事务数大于0 保存事务
save tran outertran
print @@trancount
end
else
begin
--单独调用 开始新事务
begin tran innertran
end
begin try
--执行语句
insert into testtable(id) values(@flag)
--如果执行后 有 条件不合适需要回滚 执行回滚
if @flag not in (2,4,7)
begin
if @trancount>0
begin
rollback tran outertran
return -1
end
else
begin
rollback tran innertran
return -1
end
end
else
begin
--如果执行成功 单独调用 提交事务
if @trancount=0
begin
commit tran innertran
return 0--单独调用 成功返回0
end
--嵌套调用 不提交事务 只返回 状态
else
begin
return 1--循环调用 成功返回1
end
end
end try
begin catch
--有异常 需要回滚
if @trancount>0
begin
rollback tran outertran
return -1--执行失败返回-1
end
else
begin
rollback tran innertran
return -1
end
end catch
END
GO