Ce face START TRANSACTION / COMMIT / ROLLBACK
O tranzacție începe cu START TRANSACTION. Modificările făcute după ea devin definitive abia la COMMIT. Cu ROLLBACK, toate sunt anulate și datele revin la starea de dinainte.
Exemplul clasic este un transfer de bani: scazi suma dintr-un cont și o adaugi în altul. Dacă a doua operație eșuează, nu vrei ca prima să rămână aplicată.
Tranzacțiile funcționează doar cu tabele InnoDB (tipul implicit). Comenzile care schimbă structura, ca CREATE TABLE sau ALTER TABLE, fac automat COMMIT.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE conturi (
id INT PRIMARY KEY,
titular VARCHAR(50),
sold INT
);
INSERT INTO conturi VALUES (1, 'Ana', 1000), (2, 'Dan', 200);
Exemplul 1: Transfer confirmat cu COMMIT
START TRANSACTION;
UPDATE conturi SET sold = sold - 300 WHERE id = 1;
UPDATE conturi SET sold = sold + 300 WHERE id = 2;
COMMIT;
SELECT * FROM conturi;
Rezultat
+----+---------+------+
| id | titular | sold |
+----+---------+------+
| 1 | Ana | 700 |
| 2 | Dan | 500 |
+----+---------+------+
Exemplul 2: Modificări anulate cu ROLLBACK
START TRANSACTION;
UPDATE conturi SET sold = 0;
SELECT * FROM conturi;
ROLLBACK;
SELECT * FROM conturi;
Rezultat
+----+---------+------+
| id | titular | sold |
+----+---------+------+
| 1 | Ana | 0 |
| 2 | Dan | 0 |
+----+---------+------+
+----+---------+------+
| id | titular | sold |
+----+---------+------+
| 1 | Ana | 1000 |
| 2 | Dan | 200 |
+----+---------+------+
Greșeli frecvente
- Folosești tabele MyISAM. Ele ignoră tranzacțiile, iar
ROLLBACKnu anulează nimic. - Pornești o tranzacție și uiți de
COMMIT. Când conexiunea se închide, modificările se pierd, iar până atunci rândurile modificate rămân blocate pentru alte conexiuni.
Comenzi înrudite
UPDATE: Modifică valorile din rândurile existente ale unui tabel.DELETE: Șterge rânduri dintr-un tabel.INSERT INTO: Adaugă unul sau mai multe rânduri noi într-un tabel.