Begin Tran - Go - Rollback

di il
7 risposte

Begin Tran - Go - Rollback

Ciao,
vi scrivo per avere delucidazioni in merito a quanto in oggetto.
Ammetto di avere discreta confusione in merito.

Begin Transaction:
- si usa con le transazioni di modifica. Insert, update, delete
- non si usa con select
- tendenzialmente non lo uso su create (sp, view...)

Tutto ciò che si trova fra la begin tran e la commit è sottoposto alla proprietà "Atomic". ovvero, basta una, per esempio, insert, per causare il rollback di tutte le altre. giusto?

Indipendentemente dal mettere i "go" alla fine di ciascun statement.
ad esempio:
  SET XACT_ABORT ON
  GO
  BEGIN TRANSACTION
  GO

  INSERT INTO..... #1
  GO

  INSERT INTO.....#2
  GO

  INSERT INTO.....#3
  GO

  INSERT INTO.....#4
  GO

  COMMIT
  GO
Se la insert #3 va in errore. la #4 non viene eseguita e la #1 e #2 vengono mandate in rollback.
Corretto?
Esiste un modo per far si che, in caso di errore sulla #3, le prime due vengano comunque tenute buone? un modo oltre ad aprire una singola begin tran-commit per ciascun insert into.

altra considerazione a latere.
sempre riprendendo l'esempio sopra. se l'errore non è di consistenza ma sintattico, ad esempio "INSSSSSERT INTO" sulla #3. l'esecuzione andrà in errore ma le prime due verranno correttamente applicate.

Grazie in anticipo a chiunque vorrà dare il suo contributo
V.

7 Risposte

  • Re: Begin Tran - Go - Rollback

    Tutti i comandi inclusi in una transazione vengono annullati (rollback) in caso di errore.
    Questo è il comportamento di default, qualsiasi problema si sia verificato.

    Se vuoi eseguire dei comandi a prescindere, non devi includerli nella transazione.
  • Re: Begin Tran - Go - Rollback

    Comportamento di default che è in qualche modo modificabile?
    se non le inserisco nel begin - commit vengono eseguite. ma posso lanciare il rollback in caso di errore se non sono in begin tran?
    tipo:

    if @@error != 0 rollback

    infine, e forse spalanco un argomento complesso. come si comporta in merito al transaction log? dipende dal recovery model?

    ovvero, se lancio transazione in begin tran - commit.
    alla commit, scrive nel log o nell'mdf?

    Grazie
    V.
  • Re: Begin Tran - Go - Rollback

    VC2018 ha scritto:


    Comportamento di default che è in qualche modo modificabile?
    Ovviamente no.
    Il concetto alla base di una transazione è che TUTTO deve andare a buon fine oppure NULLA deve essere eseguito: cioè, se qualcosa va storto allora è come se non fosse stata proprio eseguita e tutto deve risultare immacolato come PRIMA della sua esecuzione. E' proprio il concetto di transazione.
  • Re: Begin Tran - Go - Rollback

    Come vedi Lele ha confermato (e non poteva essere altrimenti) quanto ti ho detto.

    Per mia pignoleria, preciso però che non tutto rimane proprio 'immacolato'.
    Se erano stati inseriti record in tabelle che hanno un campo con Identity (di solito sono le PK) i valori di tali campi non vengono, ovviamente, ripristinati, ma andranno persi.
    A meno che non si esegua un immediato reindex della tabella.
  • Re: Begin Tran - Go - Rollback

    Gibra, grazie per la pignoleria. sono proprio alla ricerca del "cavillo". anche per meglio approfondire.
    Grazie lele per la conferma.

    solo, a questo punto, mi chiedo, l'uso del "GO" come possa giovare.

    se mi trovo in transazione quindi:
    begin tran
    
       insert into
       go
    
       insert into
       go
    
       insert into
       go
    
    commit tran
    in che modo è diverso da questo? (senza go)
    begin tran
    
       insert into
    
       insert into
    
       insert into
    
    commit tran
  • Re: Begin Tran - Go - Rollback

    Non cambia nulla.
    Il GO non c'entra nulla con le transazioni, è solo un'istruzione che permette di dividere per step, comodo quando esegui gruppi di istruzioni nel SSMS, ad esempio, o in qualsiasi altro tool di query.
  • Re: Begin Tran - Go - Rollback

    Grazie gibra.

    posso ora chiederti quale sia il comportamento sul transaction log?
    al momento del commit, la mia insert andrà scritta sul log?
    il comportamento cambia a seconda del recovery model?
Devi accedere o registrarti per scrivere nel forum
7 risposte