START TRANSACTION / COMMIT / ROLLBACK în MySQL

Adăugare, modificare, ștergere Tabele InnoDB (implicit din MySQL 5.5)

Grupează mai multe modificări: fie se aplică toate (COMMIT), fie niciuna (ROLLBACK).

Sintaxă
START TRANSACTION;
...
COMMIT;   -- sau ROLLBACK;

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 ROLLBACK nu 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.