SQL でストアド プロシージャを作成し、それを ( EXEC spStoredProcedure
) BEGIN/END TRANSACTION 内で呼び出した場合、この他のストアド プロシージャもトランザクションに含まれますか?
C# の try/catch のように機能するかどうかはわかりませんでした。
SQL でストアド プロシージャを作成し、それを ( EXEC spStoredProcedure
) BEGIN/END TRANSACTION 内で呼び出した場合、この他のストアド プロシージャもトランザクションに含まれますか?
C# の try/catch のように機能するかどうかはわかりませんでした。
はい、Begin Transaction と Commit (または Rollback) の間に行うことはすべてトランザクションの一部です。
いいですね、ありがとうございます。私はこのようなことをしてしまいました(私は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
Chris が述べたように、トランザクションのロールバックには注意が必要です。
具体的にはこれ:
IF @@TRANCOUNT > 0 ROLLBACK
常にあなたが望むものではありません。あなたはこのようなことをすることができます
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
このようにして、呼び出し元のプロシージャは、ストアド プロシージャからの戻り値を検査し、とにかくコミットするか、エラーをバブルアップし続けるかを判断できます。
その理由は、'COMMIT' はトランザクション カウンターを減分するだけだからです。トランザクション カウンターがゼロになると、実際のコミットが発生します。
MS SQL Server では、ストアド プロシージャの実行はトランザクション内で行われると思いますが、これには十分注意してください。ネストされたトランザクション (つまり、ストアド プロシージャの外側のトランザクションとストアド プロシージャの内側の別のトランザクション) がある場合、ロールバックは、最も近い外側のトランザクションだけでなく、すべてのトランザクションに影響します。
ChrisとJamesが述べたように、ネストされたトランザクションを扱うときは注意が必要です。SQL Server CentralでDon Petersonによって書かれたトランザクションの主題に関する一連の非常に優れた記事があります。それらを読むことをお勧めします。
ここにあります:
@クリス、私はそれを知りませんでした。
詳細をグーグルで調べていると、これに出くわしました-トランザクション全体をロールバックせずにロールバックできる「セーブポイント」を設定できます。
このような状況で役立つ可能性があります。
はい、ネストされたストアド プロシージャの呼び出しはすべて、トランザクションのスコープに含まれます。SQL Server 2005 以降を使用している場合は、Try...Catch も使用できます。 ここにその詳細があります。