Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [MySQL] Transazioni : Non ho ben capito il ROLLBACK

    Salve a tutti,
    come da oggetto non ho ben capito il Rollback.

    Riepilogando : una transazione permette di eseguire più istruzioni come un unica istruzione, alla stregua dei blocchi nei linguaggi di programmazione, al fine di salvaguardare la consistenza dei dati.
    Le transazioni iniziano con un istruzione di START TRANSACTION e terminano con un istruzione COMMIT. Nel mezzo è possibile inserire un istruzione ROLLBACK al fine di annullare le operazioni in caso di errore, impostando volendo un SAVEPOINT.
    Fin qui penso sia giusto. Le mie domande sono:
    1) Se non metto nessun ROLLBACK, in caso di errori, il COMMIT esegue ugualmente la transazione? Se no...che senso ha il ROLLBACK?
    2) Il ROLLBACK è obbligatorio?
    3) Il ROLLBACK va posto con una clausola condizionale (del tipo IF avviene_questo ROLLBACK) oppure MySQL rileva automaticamente l'errore?

    Mi rendo conto che sono domande ingenue ma vi ringrazierei per eventuali risposte.
    Matteo

  2. #2
    Guarda, io ste cose non le uso mai, ma a suoi tempo mi venne spiegato bene il loro funzionamento sotto ORACLE.

    In pratica la questione è questa:

    Se tu esegui una query di modifica secca (insert, update, delete) è effettiva sul database.

    Se tu prima utilizzi un begin transaction (o una cosa del genere) da quel momento tutte le modifiche effettuate saranno visibili ma non ancora effettive.

    Se elimini qualcosa non te lo trovi più, al momento, ma puoi ancora tornare sui tuoi passi.

    Con rollback ritorni alla situazione in cui avevi chiamato il begin transaction.

    Con commit salvi i cambiamenti e non puoi più tornare indietro.

    Da che io sappia sia rollback che commit chiudono la transazione.

  3. #3
    Anzitutto grazie per la risposta.

    Quindi, tradotto in italiano (e mi scuso con i puristi )

    Il codice MySQL:

    Codice PHP:
    START TRANSACTION                            
    ...
    COMMIT 
    Vuol dire "Fammi tutto quello che sta nel mezzo come fosse un'unica istruzione"?

    Mentre il codice MySQL:

    Codice PHP:
    START TRANSACTION                            
    ...
    ROLLBACK 
    COMMIT 
    Vuol dire "Fammi tutto quello che sta nel mezzo, ma se trovi un errore annulla tutto ed esci"?

    Ma alla fine la mie domande sono sempre la stesse:
    1) Se non metto il ROLLBACK, in caso di errore (tipo sto facendo una select su una tabella inesistente), quando la transazione giunge al COMMIT mi esegue ugualmente le istruzioni?
    2) Il ROLLBACK "intercetta" qualsiasi tipo di errore?
    3) Sto ROLLBACK è, sintatticamente parlando, obbligatorio?

    Matteo

  4. #4
    Allora, se tu devi eseguire una serie di modifiche che dovrai rendere effettive solo se eseguite tutte correttamente allora userai le transazioni.

    All'inizio darai un START TRANSACTION.

    Farai tutto quello che devi fare.

    Se ad un certo punto qualcosa va storto e vorrai tornare a com'eri all'inizio darai un ROLLBACK.

    Altrimenti, se tutto sarà andato liscio, COMMIT.

    In poche parole è come se apri un'immagine da ritoccare, quando apri l'immagine è come se dicessi START TRANSACTION, fai tutte le modifiche che vuoi e ad un certo punto dici "Non mi piace niente di quello che ho fatto!" e nella storia ritorni all'azione "Apri", sarebbe come dire ROLLBACK, oppure decidi di salvare e sarà come dire COMMIT.

  5. #5
    In poche parole è come se apri un'immagine da ritoccare, quando apri l'immagine è come se dicessi START TRANSACTION, fai tutte le modifiche che vuoi e ad un certo punto dici "Non mi piace niente di quello che ho fatto!" e nella storia ritorni all'azione "Apri", sarebbe come dire ROLLBACK, oppure decidi di salvare e sarà come dire COMMIT.
    Bello sto esempio
    Ora provo qualche transazione...
    Cmq se è così il rollback dovrebbe essere l'ultima istruzione prima della commit!

    Il mio dubbio sorgeva a causa di un esempio trovato su internet. Te lo pongo così ci capiamo.
    Bisogna fare una transazione bancaria e, quindi, due operazioni:
    1) Togliere soldi al mittente
    2) Aggiungere questi soldi al destinatario
    Il tutto all'interno di una TRANSACTION al fine di preservare la consistenza dei dati.
    In questo esempio, per me dubbio, faceva così:

    Codice PHP:
    START TRANSACTION
    ...togli i soldi al mittende(1)...
    ROLLBACK 
    ...metti i soldi al destinatario (2)...
    ROLLBACK
    COMMIT 

    Il mio dubbio sorgeva per questo esempio: perchè due rollback? non ne bastava uno solo?

    Matteo

  6. #6
    Perché è se può capitarti più di qualche occasione d'errore richiami in quel momento il rollback.

    Quello che non so dirti però, primo perché l'esempio lo studiai, anzi, studiatti proprio (un sacco di tempo fa ), su oracle, poi perché proprio non ricordo, è se il rollback chiuda la transazione dopo aver ripristinato la situazione come era all'inizio del start transaction o lasci ancora la transazione aperta.

    Se il rollback chiude ok, se non chiude, comunque, a prescindere se è stato fatto o no va fatto un commit alla fine.

  7. #7
    Anche se mi restano ancora alcuni dubbi voglio cmq ringraziarti per la disponibilità e la pazienza.

    A presto (perchè son certo che mi ritroverò a scrivere sul forum )

    Matteo

  8. #8
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    ciao , io non so se utilizzare un commit rollback per cio che devo fare ... vi chiedo consiglio, anche perchè se ci fosse una soluzione più semplice preferirei

    io ho n tabelle di inserimento(le tabelle vengono create tramite una scelta dell'utente; quindi potrei averne anche 100)
    L'utente quando preme invio manda Tutti i dati alla pagina che gli elaborerà inserendoli nel db e scrivndo un file.
    Avrei bisogno di effettuare un controllo su ogni tabella inviata...
    il prg scrive su db e file una tabella alla volta. Dovrei verificare che non esistano tabelle con lo stesso nome .

    avendo 3 tabelle effettuo una verifica nel db , ma una volta che lui non trova nulla mi scrive le 2 tabelle restanti senza effettuare verifiche !
    mi conviene un rollback
    ?

    grazie, ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.