2 つのストアド プロシージャがあるOuter
としInner
ます。
CREATE PROCEDURE dbo.Outer
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN
EXEC Inner
-- Perform additional processing (which should not occur if there is
-- a ROLLBACK in Inner)
...
COMMIT
END;
GO
ストアド プロシージャはOuter
XACT_ABORT をオンにし、明示的なトランザクションを開始します。Inner
次に、トランザクション内でストアド プロシージャを呼び出します。
CREATE PROCEDURE dbo.Inner
AS
BEGIN
DECLARE @Id INT=(SELECT Id FROM SomeTable WHERE ...);
IF (@Id IS NOT NULL)
ROLLBACK;
INSERT INTO SomeTable(...)
VALUES (...);
END;
GO
Inner
ストアド プロシージャは、何かが存在するかどうかを確認するためのチェックを実行し、ストアド プロシージャで開始されたトランザクション全体をロールバックし、との両方でOuter
以降のすべての処理を中止する必要があるかどうかを確認します。Inner
Outer
上記で概説したように私が期待していることの代わりに起こることは、エラーメッセージが表示されることです:
内部:
EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致していないことを示しています。前のカウント = 1、現在のカウント = 0。
外側:
COMMIT TRANSACTION リクエストには、対応する BEGIN TRANSACTION がありません。
明らかに、ROLLBACK
XACT_ABORT がオンになっていても、実行の流れは停止しません。RETURN
の後にステートメントを置くと、ROLLBACK
から抜け出しますがInner
、 の実行はOuter
続きます。ROLLBACK
がそれ以降のすべての処理を停止し、効果的に を終了させるにはどうすればよいOuter
ですか?
助けてくれてありがとう。