sql >> Database teknologi >  >> RDS >> Sqlserver

Transaktionsantal efter EXECUTE angiver et forkert antal BEGIN- og COMMIT-udsagn. Tidligere tælling =1, nuværende tælling =0

Hvis du har en TRY/CATCH-blokering, er den sandsynlige årsag, at du fanger en undtagelse for afbrydelse af transaktionen og fortsætter. I CATCH-blokken skal du altid tjekke XACT_STATE() og håndtere passende afbrudte og uforpligtende (dømte) transaktioner. Hvis din opkalder starter en transaktion, og caleeen rammer f.eks. et dødvande (som afbrød transaktionen), hvordan vil den opkaldte så kommunikere til den, der ringer, at transaktionen blev afbrudt, og at den ikke skulle fortsætte med 'business as usual'? Den eneste mulige måde er at genfremsætte en undtagelse, hvilket tvinger den, der ringer til, til at håndtere situationen. Hvis du stille sluger en afbrudt transaktion, og den, der ringer, fortsætter med at antage, at den stadig er i den oprindelige transaktion, kan kun kaos sikre (og fejlen, du får, er den måde, motoren forsøger at beskytte sig selv på).

Jeg anbefaler, at du gennemgår undtagelseshåndtering og indlejrede transaktioner som viser et mønster, der kan bruges med indlejrede transaktioner og undtagelser:

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
go


  1. hvordan udtrækkes kun året fra datoen i sql server 2008?

  2. Ruby og MySQL UTF-8 tegn

  3. bruge Oracle Loader til at importere HBase-data til Oracle-tabellen

  4. Databasestruktur for kategori på flere niveauer (bedste tilgang)