------外层事务
declare @flag int
set @flag=0declare @successcount int
set @successcount=0declare @returnvalue int
begin tran t1
while @flag<10begin set @flag=@flag+1--调用内层事务,存储过程
exec @returnvalue= testpro @flag=@flag if @returnvalue=1 begin set @successcount=@successcount+1 endendif @successcount>0
begincommit tran t1endelsebeginrollback tran t1end---内层事务(存储过程)
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOalter PROCEDURE [dbo].[testpro]
(@flag int)ASBEGINdeclare @trancount int set @trancount= @@trancountprint @trancountif @trancount>0
begin--如果事务数大于0 保存事务save tran outertranprint @@trancountendelsebegin--单独调用 开始新事务begin tran innertranendbegin 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 endendelsebegin--如果执行成功 单独调用 提交事务 if @trancount=0 begin commit tran innertran return 0--单独调用 成功返回0 end --嵌套调用 不提交事务 只返回 状态 else begin return 1--循环调用 成功返回1 endendend trybegin catch--有异常 需要回滚 if @trancount>0 begin rollback tran outertran return -1--执行失败返回-1 end else begin rollback tran innertran return -1 endend catchEND
GO