我创建了以下存储过程。
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。
答案 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>