sql >> Databáze >  >> RDS >> Sqlserver

SQL Server – vnořené transakce v uložené proceduře

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.



  1. Datový model organizace svatby

  2. Nejlepší způsob, jak otestovat, zda existuje řádek v tabulce MySQL

  3. Příkaz aktualizace běží příliš dlouho nebo ne

  4. Oracle 10g:Může být délka dat CLOB menší než 4 000?