嵌套事务和遵循回滚

时间:2012-09-19 19:46:08

标签: sql sql-server-2008 tsql

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

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

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

1 个答案:

答案 0 :(得分: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;