Le transazioni assicurano che le query che modificano valori in relazione tra loro ma appartenenti a più di una tabella del data base siano eseguite come se si trattasse di un'unica query. Ciò che si desidera, in particolare, è che se una query termina in errore allora tutte le tabelle coinvolte nell'operazione vengano ripristinate allo stato antecedente l'inizio della transazione.
L'operazione di annullare la modifica alle tabelle è detta Roll-Back.
Si può richiamare il Roll-Back di una transazione quando si trovano errori oppure in seguito a un'istruzione.
Le transazioni, usate in tabelle InnoDB hanno le seguenti proprietà:
I Savepoint nelle transazioni, sono posizioni a cui il Roll-Back si arresterà. I Savepoint sono collocati a discrezione del programmatore. Le operazioni della transazione che precedono i savepoint comporteranno un aggiornamento del database anche se la transazione fallisce.
InnoDB offre 4 livelli di isolamento:
L'isolamento di default di InnoDB ` il numero 3: Repeatable Read. Il livello di isolamento può essere impostato anche in fase di esecuzione con l'istruzione SET TRANSACTION.
Le transazioni sono iniziate con SET TRANSACTION e terminano con un'istruzione COMMIT o con
un'istruzione ROLL-BACK.
COMMIT conferma l'esecuzione delle istruzioni SQL, l'istruzione
ROLL-BACK le annulla.
Come esempio di transazioni creiamo un'applicazione di negozio online.
Le tabelle coinvolte riguardano la vendita, il carrello e l'inventario e saranno modificate a seconda dell'esito del
controllo della carta di credito del cliente.
Se l'acquisto è approvato la vendita viene confermata, l'ordine verrà preso in considerazione e
l'articolo verrà sottratto dal carico di magazzino. Se la carta di credito non è riconosciuta la vendita
viene annullata e alle tabelle si applicherà il Roll-Back per riportarle al loro stato precedente.
mysql> create database carrello; Query OK, 1 row affected (0.05 sec) mysql> use carrello; Database changed
mysql> create table vendite ( -> nome varchar(25), -> IDutente mediumint(9) not null, -> IDprod int (11), -> indirizzo varchar(250) not null, -> dataOrdine date not null, -> nomeProd varchar(50), -> prezzo decimal(6,2) not null -> ); Query OK, 0 rows affected (0.23 sec)
mysql> create table magazzino ( -> IDprod int(11) not null, -> qtaScorta int(11) not null, -> nomeProd varchar(50) not null -> ); Query OK, 0 rows affected (0.08 sec)
mysql> create table spedizione ( -> IDprod int(11) not null, -> nome varchar(25), -> indirizzo varchar(250), -> dataAcquisto date not null, -> dataSpedizione date not null -> ); Query OK, 0 rows affected (0.08 sec)
Inserire almeno un prodotto di magazzino nella tabella magazzino:
mysql> insert into magazzino -> (IDprod, qtaScorta, nomeProd) -> values ('1234', '250', 'detersivo'); Query OK, 1 row affected (0.08 sec)
Le tabelle Vendite e Spedizione sono vuote
Creare un utente e concedergli i permessi di accesso lal database:
mysql> grant all on carrello.* to dondiego@localhost -> identified by 'zorro'; Query OK, 0 rows affected (0.25 sec)
Le transazioni non rispondono agli eventi, cioè il Roll Back o il Commit non può essere introdotto da linea di commando per completare la transazione.
Per usare efficacemente le transazioni, quindi, bisogna inserirle in un programma. Nell'esempio seguente la transazione o viene approvata o viene annullata a seconda del valore della variabile $accettata che indica se la carta di credito, o la forma di pagamento scelta, è riconosciuta.