0

一般来说,我只想能够做到这一点:

begin transaction
begin transaction
select 'x'
rollback
rollback

原因是,我有一个存储过程,代码如下:

begin transaction

--Do stuff

If(problem)
begin 
    rollback
end else begin
    commit
end

它就像我想要的那样工作,但我想通过这样做来测试它:

begin transaction
exec MyStoredProc
rollback

当存储过程执行回滚时,它似乎关闭了两个事务,然后我在存储过程之外的回滚失败。

4

1 回答 1

2

SQL Server 中不存在自治事务。嵌套事务有助于增加@@TRANCOUNT,但仅此而已。正如@marc_s 在他的评论中所建议的那样,ROLLBACK它不仅仅适用于当前的事务范围/级别,它适用于整个事情。

该请求在 2008 年被拒绝:

http://connect.microsoft.com/SQLServer/feedback/details/324569/add-support-for-true-nested-transactions

但是,此请求仍然有效 - 所以也许有希望:

http://connect.microsoft.com/SQLServer/feedback/details/296870/add-support-for-autonomous-transactions

至于您的外部回滚失败,您始终可以先检查这一点,而不是盲目地进行,例如:

IF @@TRANCOUNT > 0
  ROLLBACK TRANSACTION;
于 2012-09-19T19:48:15.140 回答