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

Skal jeg bruge en try..catch-blok og eksplicit rollback i en SQL Server-procedure?

Svaret på dit spørgsmål afhænger af SET XACT_ABORT indstilling:

Prøv for eksempel følgende kode. Den første division med 0 giver en fejl, men fortsætter udførelsen . Den anden division med nul rejser en fejl og stopper udførelsen:

begin transaction

set xact_abort off
    
select 1 / 0 -- causes divide by zero error, but continues
select @@trancount -- returns 1

set xact_abort on

select 1 / 0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here

rollback

Hvis XACT_ABORT er TIL, vil fejl afbryde transaktionen, og du behøver ikke at prøve/fange.

Hvis XACT_ABORT er FRA, skal du kontrollere status for hver erklæring for at se, om der opstod en fejl:

begin transaction

delete from...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

insert into...
if @@error <> 0
begin
    if @@trancount > 0
        rollback
    return
end

commit

Men hvis du nogensinde finder et tilfælde, hvor du har brug for at PRØVE / FANGE, kan du være nødt til at gøre noget særligt, når fejlen opstår. Hvis det er tilfældet, så glem ikke at PRØV / FANG undtagelseshåndteringen:

begin transaction

set xact_abort on

begin try
    select 1 / 0 -- causes divide by zero error and terminates execution
    select @@trancount -- we never get here
    commit
end try
begin catch
    select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
    select @@trancount -- this will probably be one, because we haven't ended the transaction yet
    if xact_state() <> 0
    begin try
        select 'rollback'
        rollback
        
        -- do something to handle or record the error before leaving the current scope
        select 'exception processing here'
        --insert into...
    end try
    begin catch
        -- ignore rollback errors
    end catch
    
end catch


  1. datoformat i node.JS

  2. Bruger du Dropwizard og JDBI til at forespørge databaser med flere skemaer?

  3. IIS7, SQL 2008 og ASP.NET MVC sikkerhed

  4. Hvordan bruger man DATEDIFF til at returnere år, måned og dag?