执行在事务中保存tran的proc得到了“BEGIN和COMMIT的数量不匹配”的错误?

时间:2018-01-23 22:38:45

标签: sql-server tsql

我创建了以下存储过程。

alter proc test
as
if @@trancount = 0
begin
    begin tran test;
end;
else
begin
    save tran test;
end;

-- ......

if @@trancount > 0
begin
    print formatmessage('trancount %d', @@trancount);
    commit tran test;
    print formatmessage('commit %d', @@trancount);
end;

它在exec dbo.test时有效。但是,以下代码出现以下错误?

begin tran; 
exec dbo.test;
rollback; -- Or commit
  

Msg 266,Level 16,State 2,Procedure test,Line 19

     

EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前的计数= 1,当前计数= 0。

     

Msg 3902,Level 16,State 1,Line 22

     

COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION。

2 个答案:

答案 0 :(得分:2)

SAVE TRAN不会创建嵌套事务,因此当您COMMIT TRAN时,您将提交在proc之外启动的事务。这是不允许的,产生错误。

如果你想在proc中保存TRAN,那么你不提交,只是在出错时ROLLBACK到保存点。

答案 1 :(得分:0)

以下代码显示了一种创建proc的方法,该方法可以提交/回滚其事务,并在另一个事务中执行或不执行。

<div class='container-node'>
 <a href='1.pdf'>Story 1</a>
 <a href='2.pdf'>Story 2</a>
 <a href='3.pdf'>Story 3</a>
 <a href='special-edition1.pdf'>Special Edition 1</a>
 <a href='4.pdf'>Story 4</a>
 <a href='special-edition2.pdf'>Special Edition 2</a>
</div>