BEGIN / END TRANSACTION内でストアドプロシージャを実行する
-
05-07-2019 - |
質問
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 に出会いました。トランザクション全体をロールバックせずにロールバックできる「セーブポイント」を設定できます。
この状況で役立つ可能性があります。