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 に答える