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
ストアド プロシージャはOuterXACT_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以降のすべての処理を中止する必要があるかどうかを確認します。InnerOuter
上記で概説したように私が期待していることの代わりに起こることは、エラーメッセージが表示されることです:
内部:
EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致していないことを示しています。前のカウント = 1、現在のカウント = 0。
外側:
COMMIT TRANSACTION リクエストには、対応する BEGIN TRANSACTION がありません。
明らかに、ROLLBACKXACT_ABORT がオンになっていても、実行の流れは停止しません。RETURNの後にステートメントを置くと、ROLLBACKから抜け出しますがInner、 の実行はOuter続きます。ROLLBACKがそれ以降のすべての処理を停止し、効果的に を終了させるにはどうすればよいOuterですか?
助けてくれてありがとう。