0

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ですか?

助けてくれてありがとう。

4

2 に答える 2

1

ロールバックを発行しても、バッチは中止されません (XACT_ABORT 設定に関係なく)。システムまたは RAISERROR を介して生成されたカスタムのいずれかで、十分に高い重大度のエラーがスローされた場合、バッチは自動的に中止されます。

于 2013-01-25T17:31:06.870 に答える
0

実装する必要がありますException Handling

Begin Try
    Set NOCOUNT ON
    SET XACT_ABORT ON
    Begin Tran
        --Your Code
    Commit Tran
End Try

Begin Catch
    Rollback Tran
End Catch
于 2012-07-19T18:26:04.993 に答える