Skip to content

Cum să folosești tranzacții în baze de date — BEGIN, COMMIT, ROLLBACK

DodaTech Updated 2025-01-15 3 min read

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 blocuri try-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

  1. Uitarea COMMIT — tranzacția rămâne deschisă, blochează alte operații
  2. ROLLBACK automat neimplementat — eroarea nu anulează tranzacția
  3. Tranzacții prea lungi — blochează tabele și cauzează deadlock-uri
  4. Amestecarea DDL cu DML — CREATE/ALTER în mijlocul unei tranzacții poate face COMMIT implicit
  5. 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

### Ce se întâmplă dacă se pierde conexiunea în timpul unei tranzacții?

Baza de date execută automat ROLLBACK. Tranzacțiile nefinalizate cu COMMIT sunt întotdeauna anulate la deconectare.

Pot face COMMIT după fiecare operație într-o tranzacție?

Nu, COMMIT încheie tranzacția. Dacă vrei COMMIT după fiecare operație, lucrezi în modul auto-commit implicit.

Care este diferența dintre ROLLBACK și ROLLBACK TO SAVEPOINT?

ROLLBACK anulează întreaga tranzacție. ROLLBACK TO SAVEPOINT anulează doar operațiile de după savepoint, păstrând restul tranzacției active.

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