sql server 事务嵌套 并行执行

------外层事务

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

posted on 2014-04-11 10:36  习惯简单  阅读(1353)  评论(0编辑  收藏  举报

导航