Cum să folosești tranzacții în baze de date — BEGIN, COMMIT, ROLLBACK
In this tutorial, you'll learn about Cum să folosești tranzacții în baze de date. We cover key concepts, practical examples, and best practices.
Cum să folosești tranzacții în baze de date cu BEGIN, COMMIT și ROLLBACK pentru a grupa operații multiple într-o unitate atomică care se execută integral sau se anulează complet.
Problema
Operațiile individuale pe baza de date (INSERT, UPDATE, DELETE) se execută automat în mod implicit. Dacă o serie de operații trebuie să se execute împreună — de exemplu, un transfer bancar între două conturi — o eroare la mijloc poate lăsa datele într-o stare inconsistentă.
The Wrong Way
Executarea operațiilor fără tranzacție explicită, în modul auto-commit:
-- Scenariu: transferă 500 lei din contul 1 în contul 2
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
-- Aici apare o eroare (deconectare, crash)
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
Problema: Prima operație s-a executat (banii au fost scoși), dar a doua a eșuat (banii nu au fost adăugați). 500 lei dispar din sistem fără urmă.
The Right Way
Grupează operațiile într-o tranzacție explicită:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
-- Verifică soldul
SELECT balance FROM accounts WHERE id = 1;
-- Soldul este suficient, continuăm
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
COMMIT;
Dacă ceva merge greșit, rulează ROLLBACK:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
-- A apărut o eroare, anulăm tot
ROLLBACK;
-- Soldul contului 1 este neschimbat
Step-by-Step Fix
1. Începe tranzacția cu BEGIN
BEGIN;
-- sau în MySQL:
START TRANSACTION;
Baza de date iese din modul auto-commit și așteaptă comenzi explicite.
2. Execută operațiile
INSERT INTO orders (customer_id, total) VALUES (1, 1500);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 42;
INSERT INTO order_items (order_id, product_id, qty) VALUES (LASTVAL(), 42, 1);
3. Confirmă cu COMMIT
COMMIT;
Toate modificările devin permanente și vizibile altor tranzacții.
4. Anulează cu ROLLBACK la eroare
ROLLBACK;
Toate modificările din tranzacție sunt anulate. Baza de date revine la starea de dinainte de BEGIN.
5. Folosește SAVEPOINT pentru rollback parțial
BEGIN;
INSERT INTO logs (event) VALUES ('start');
SAVEPOINT sp1;
INSERT INTO logs (event) VALUES ('mid');
-- eroare
ROLLBACK TO sp1; -- anulează doar al doilea INSERT
INSERT INTO logs (event) VALUES ('after_rollback');
COMMIT;
Rezultat: start și after_rollback sunt inserate, mid este anulat.
Prevention Tips
- Folosește tranzacții explicite pentru orice grup de operații care trebuie să fie atomic
- Gestionează erorile cu
BEGIN/COMMIT/ROLLBACKîn blocuritry-catch - Păstrează tranzacțiile scurte — nu bloca resurse mai mult decât e necesar
- Setează isolation level corespunzător (READ COMMITTED pentru majoritatea cazurilor)
Greșeli comune cu tranzacții
- Uitarea COMMIT — tranzacția rămâne deschisă, blochează alte operații
- ROLLBACK automat neimplementat — eroarea nu anulează tranzacția
- Tranzacții prea lungi — blochează tabele și cauzează deadlock-uri
- Amestecarea DDL cu DML — CREATE/ALTER în mijlocul unei tranzacții poate face COMMIT implicit
- Ignorarea isolation level — citiri murdare sau non-repetabile când nu se potrivește
Exercițiu practic
Scrie o tranzacție care creează un client nou, o comandă pentru acesta și actualizează stocul produselor comandate. Testează cu ROLLBACK după INSERT pentru a verifica că datele nu persistă.
Soluție:
BEGIN;
INSERT INTO customers (name, email) VALUES ('Test', 'test@email.com');
INSERT INTO orders (customer_id, total) VALUES (LASTVAL(), 200);
UPDATE products SET stock = stock - 1 WHERE id = 10;
ROLLBACK;
-- Verifică: niciun rând nou în customers, orders sau products
FAQ
Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează nativ cu bazele de date pentru productivitate și securitate sporite.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro