質問

SQLでストアドプロシージャを作成し、BEGIN / END TRANSACTION内で呼び出す( EXEC spStoredProcedure )場合、この他のストアドプロシージャもトランザクションに分類されますか?

C#でtry / catchesのように機能するかどうかは知りませんでした。

役に立ちましたか?

解決

はい、トランザクションの開始とコミット(またはロールバック)の間に行うすべての処理はトランザクションの一部です。

他のヒント

すばらしいですね、ありがとう。私は最終的にこのようなことをしました(私は05にいるからです)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH

MS SQL Serverでは、ストアドプロシージャの実行はトランザクション内で行われると考えていますが、これには十分注意してください。ネストされたトランザクション(つまり、ストアドプロシージャ外のトランザクションとストアドプロシージャ内の別のトランザクション)がある場合、ロールバックは、最も近い外側のトランザクションだけでなく、すべてのトランザクションに影響します。

Chrisが述べたように、トランザクションのロールバックには注意が必要です。

具体的にはこれ:

IF @@TRANCOUNT > 0 ROLLBACK

は常にあなたが望むものではありません。このようなことができます

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

このようにして、呼び出し側のプロシージャはストアドプロシージャからの戻り値を検査し、とにかくコミットするか、エラーをバブルアップし続けるかを決定できます。

理由は、「COMMIT」がトランザクションカウンタを減らすだけだからです。トランザクションカウンターをゼロまでデクリメントすると、実際のコミットが発生します。

クリスおよび James に記載されているように、ネストされたトランザクションを扱うときは注意が必要です。 Don Peterson SQL Server Centra lで、これらを読むことをお勧めします。

ここにあります:

はい、ネストされたすべてのストアドプロシージャコールはトランザクションのスコープに含まれます。 SQL Server 2005以降を使用している場合は、Try ... Catchも使用できます。 こちらはその詳細です。

@クリス、私はそれを知りませんでした。

詳細情報を探していると、 this に出会いました。トランザクション全体をロールバックせずにロールバックできる「セーブポイント」を設定できます。

この状況で役立つ可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top