ストアド プロシージャ内の適切なスコープのトランザクション
-
01-07-2019 - |
質問
独自のトランザクションを管理するストアド プロシージャがあるとします。
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
既存のトランザクションからこのプロシージャを呼び出すと、プロシージャは外部トランザクションを ROLLBACK できます。
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
ストアド プロシージャが外部トランザクションをロールバックしないように、ストアド プロシージャ内でトランザクションのスコープを適切に設定するにはどうすればよいですか?
解決
これを行うための構文はデータベースによって異なる可能性があります。ただし、Transact-SQL では、@@TRANCOUNT をチェックしてトランザクション中かどうかを確認するだけです。その場合は、セーブポイントを作成し、最後に関数の最後を通過するか (後でコミットまたはロールバックが行われると考えて)、セーブポイントにロールバックすることができます。
Microsoft のドキュメントを参照してください。 セーブポイント 多くのための。
セーブポイントのサポートはかなり広く普及していますが、現在トランザクション中であることを確認するためのメカニズム (それがあると仮定して) はかなり異なると思います。
他のヒント
@@trancount を使用して、入力時にすでにトランザクション中かどうかを確認します
所属していません StackOverflow