sql >> Databasteknik >  >> RDS >> Sqlserver

Behöver jag använda ett try..catch-block och explicit rollback i en SQL Server-procedur?

Svaret på din fråga beror på SET XACT_ABORT inställning:

Prova till exempel följande kod. Den första divisionen med 0 ger upphov till ett fel men fortsätter exekveringen . Den andra divisionen med noll ger upphov till ett fel och stoppar exekveringen:

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

Om XACT_ABORT är PÅ kommer fel att avbryta transaktionen, och du behöver ingen TRY/CATCH.

Om XACT_ABORT är AV måste du kontrollera statusen för varje sats för att se om ett fel inträffade:

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 om du någon gång hittar ett fall där du behöver PROVA / FÅNGA, kan du behöva göra något speciellt när felet uppstår. Om så är fallet, glöm inte att PROVA / FÅNGA undantagshanteringen:

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. Lägg dynamiskt till en kolumn med flera värden till valfri tabell med hjälp av en PL/pgSQL-funktion

  2. MySQL Klienten och servern kan inte kommunicera, eftersom de inte har en gemensam algoritm

  3. Skapa en filtrerbar lista med hjälp av Laravel- och Eloquent-frågor

  4. PostgreSQL datum och tid funktioner