SqlServer嵌套事务机制测试(二)
select @@TRANCOUNT '开内部事务1';
save tran InProc;
select @@TRANCOUNT '保存内部事务1';
INSERT INTO #TestTrans VALUES (1,'aaaa');
ROLLBACK TRANSACTION InProc;
select @@TRANCOUNT '回滚内部事务1';
--内部事务2
BEGIN TRANSACTION InProc2
INSERT INTO #TestTrans VALUES (2,'222');
--内部事务21
BEGIN TRANSACTION InProc21
select @@TRANCOUNT '开内部事务21';
INSERT INTO #TestTrans VALUES (3,'2422');
COMMIT TRANSACTION InProc21;
select @@TRANCOUNT '提交内部事务21';
COMMIT TRANSACTION InProc2;
select @@TRANCOUNT '提交内部事务2';
/* 提交外部事务 */
COMMIT TRANSACTION OutOfProc;
select @@TRANCOUNT '提交外部事务';
SELECT * FROM #TestTrans;
drop table #TestTrans
结果:

其他:
保存事务回滚点--可以有选择的提交或回滚内部嵌套事务。
思路
检查@@TRANCOUNT的值,以此来确定是否需要开始一个事务。如果@@TRANCOUNT大于0,则不开启新事务,只需要保存的个回滚位置即可;否则,开启新事务。下面是操作:
1.保存回滚点:
[java script]
declare @trancount int --commit,rollback只控制本存储过程
set @trancount = @@trancount
if (@trancount=0) /*判断事务记数,根据情况确定使用保存点或者新建一个事务*/
begin tran curtran--当前事务点,rollback、commit都从这里开始
else
save tran curtran
2. 回滚指定“回滚点”: www.2cto.com
[sql]
if(@error <> 0 or @pay_way_error = 0) --@pay_way_error 决定了是否需要回滚
begin
rollback tran curtran
set @result = -1 --异常
end
[sql]
if(@error <> 0 or @pay_way_error = 0) --@pay_way_error 决定了是否需要回滚
begin
rollback tran curtran
set @result = -1 --异常
end