![]() |
| Home | Chi sono | Mappa del sito | Contatti |
|
Tutorial su Mysql->Transazione protette
Transazione protetteUna transazione si intende un insieme di una o più interrogazioni a database. Prima di spiegare cosa sia una transazione protetta, è necessario mostrare alcuni problemi che possono sorgere in un gestionale con query senza gestione di transazioni protette. Prendiamo come esempio un semplice programma che gestisce un magazzino, gli ordini dei clienti e gli ordini dei fornitori.Eseguire lo scarico del magazzino mediante evasione degli ordini dei clienti, vuol dire essenzialmente eseguire due query. Vediamo il codice in PHP relativo allo scarico dell'articolo $id_articolo di quantità $qta, relativo al dettaglio ordine $id_dettaglio_ordine. Poiché l'operazione viene eseguita in due query, può accadere che tra la fine della prima esecuzione e l'inizio della seconda, ci siano le esecuzioni di altre query in corso. Una visualizzazione delle disponibilità potrebbe far risultare che l'articolo $id_articolo, ha una giacenza maggiore di quella reale. Lo stesso problema si ha con tutte le operazioni che hanno a che fare con quell'articolo. Un altro tipo di problema, ancora più grave, si potrebbe verificare quando, all'interno di un certo numero di query "critiche" avviene un blocco del programma, ad esempio per via di un errore, un blocco della rete, ecc.. In questo caso poiché l'operazione non verrà mai completata, le anomalie rimangono presenti nel sistema fino a quando non si effettua un intervento correttivo. Quindi è molto meglio proteggere le query tramite transazioni protette. Queste ultime consentono di gestire un certo numero di query come se fossero una sola. L'inizio di una transazione protetta avviene tramite l'istruzione SQL "START TRANSACTION" e finisce con l'istruzione "COMMIT". L'effetto delle query all'interno di queste istruzioni, si hanno solo quando si è eseguita la "COMMIT", quindi un'interrogazione eseguita contemporaneamente a questa non potrà vedere le modifiche apportate. Se il programma si blocca, tutte le query eseguite successivamente a "START TRANSACTION", sono automaticamente annullate. Lo stesso effetto si ha eseguendo l'istruzione SQL "ROLLBACK". Quindi possiamo riscrivere il codice in questo modo In questo codice la funzione errore_db(), in caso di errore, blocca l'esecuzione del programma, e quindi se ci sono blocchi all'interno di una transazione, automaticamente le query in esso eseguiti verrebbe annullati. Riepilogo
|