Je možné, aby byla práce vykonaná SP2 vrácena zpět a neztratila se práce vykonaná SP1. Ale aby k tomu došlo, musíte své uložené procedury napsat pomocí velmi specifického vzoru, jak je popsáno v Zpracování výjimek a vnořené transakce :
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
Ne všechny chyby jsou opravitelné, existuje řada chybových stavů, ze kterých se transakce nemůže zotavit, nejviditelnějším příkladem je uváznutí (na výjimku uváznutí jste upozorněni po transakce již byla odvolána). SP1 i [email protected]
musí být napsán pomocí tohoto vzoru. Pokud máte nepoctivého SP nebo chcete jednoduše využít existující uložené procedury, které chtě nechtě vydávají ROLLBACK
prohlášení, pak je vaše věc ztracena.