SP2 によって行われた作業がロールバックされ、SP1 によって行われた作業が失われない可能性があります。ただし、これを行うには、例外処理とネストされたトランザクション :
create procedure [usp_my_procedure_name] as begin set nocount on; declare @trancount int; set @trancount = @@trancount; begin try if @trancount = 0 begin transaction else save transaction usp_my_procedure_name; -- Do the actual work here lbexit: if @trancount = 0 commit; end try begin catch declare @error int, @message varchar(4000), @xstate int; select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); if @xstate = -1 rollback; if @xstate = 1 and @trancount = 0 rollback if @xstate = 1 and @trancount > 0 rollback transaction usp_my_procedure_name; raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; end catch end
プレ>すべてのエラーが回復できるわけではありません。トランザクションが回復できないエラー状態がいくつかあります。最も明白な例はデッドロックです (デッドロック例外が通知される後 トランザクションはすでにロールバックされています)。 SP1 と [email protected] の両方 このパターンを使用して記述する必要があります。不正な SP を使用している場合、または
ROLLBACK
を無意味に発行する既存のストアド プロシージャを単純に活用したい場合