4

独自のトランザクションを管理するストアドプロシージャがあるとします。

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

このprocを既存のトランザクションから呼び出すと、procは外部トランザクションをロールバックできます。

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

ストアドプロシージャが外部トランザクションをロールバックしないように、ストアドプロシージャ内でトランザクションを適切にスコープするにはどうすればよいですか?

4

2 に答える 2

2

これを行うための構文は、おそらくデータベースによって異なります。しかし、Transact-SQL では、@@TRANCOUNT をチェックして、トランザクション中であるかどうかを確認します。セーブポイントを作成したい場合は、最後に関数の最後を通過するか (コミットまたはロールバックが後で行われると信じています)、またはセーブポイントにロールバックします。

詳細については、セーブポイントに関する Microsoft のドキュメントを参照してください。

セーブポイントのサポートはかなり広まっていますが、現在トランザクション中であることを確認するためのメカニズム (あると仮定して) はかなり異なると思います。

于 2008-09-18T23:18:47.257 に答える
1

@@trancount を使用して、入力時にすでにトランザクションに参加しているかどうかを確認します

于 2008-09-18T23:16:25.187 に答える