Ce face mysqli_begin_transaction
O tranzacție grupează mai multe comenzi într-o singură operație „totul sau nimic”. Exemplul clasic: la o comandă scazi stocul și salvezi comanda. Dacă a doua operație eșuează, nici prima nu trebuie să rămână. Începi cu mysqli_begin_transaction, iar la final apelezi mysqli_commit (salvează) sau mysqli_rollback (anulează).
Tranzacțiile funcționează doar pe tabele InnoDB, motorul implicit din MySQL 8. Opțiuni pentru $flags: MYSQLI_TRANS_START_READ_ONLY, MYSQLI_TRANS_START_READ_WRITE, MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT. Parametrul $name este doar un comentariu adăugat la comanda SQL.
Exemplele de pe această pagină folosesc baza de date magazin, cu tabelul produse (coloanele id INT AUTO_INCREMENT, nume VARCHAR(100) NOT NULL, pret INT și stoc INT) și patru rânduri: Laptop (3200 lei, 5 buc.), Mouse (80 lei, 40 buc.), Monitor (900 lei, 0 buc.) și Tastatură (150 lei, 12 buc.). Comenzile SQL sunt explicate în secțiunea MySQL. Rezultatele au fost scrise pentru MySQL 8, pentru că exemplele au nevoie de un server de baze de date.
Parametri
| Parametru | Descriere |
|---|---|
$mysql |
Conexiunea. |
$flags |
Opțional. Constante MYSQLI_TRANS_START_*. |
$name |
Opțional. Un nume, trimis ca și comentariu (START TRANSACTION /*nume*/). |
Ce returnează
true la succes.
Exemple
Exemplul 1: Comandă cu scăderea stocului
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
function cumpara(mysqli $conn, int $idProdus, int $bucati): string
{
mysqli_begin_transaction($conn);
try {
mysqli_execute_query($conn, "UPDATE produse SET stoc = stoc - ? WHERE id = ? AND stoc >= ?", [$bucati, $idProdus, $bucati]);
if (mysqli_affected_rows($conn) === 0) {
throw new RuntimeException("stoc insuficient");
}
mysqli_execute_query($conn, "INSERT INTO comenzi (produs_id, bucati) VALUES (?, ?)", [$idProdus, $bucati]);
mysqli_commit($conn);
return "Comandă salvată";
} catch (Throwable $e) {
mysqli_rollback($conn);
return "Comandă anulată: " . $e->getMessage();
}
}
echo cumpara($conn, 2, 3) . "\n";
echo cumpara($conn, 3, 1);
Rezultat (cu un server MySQL, tabelul produse și un tabel comenzi)
Comandă salvată
Comandă anulată: stoc insuficient
Greșeli frecvente
- Folosești tranzacții pe un tabel MyISAM. MyISAM nu are tranzacții: fiecare comandă se salvează imediat, iar
rollbacknu anulează nimic. - Rulezi în tranzacție o comandă care modifică structura (
CREATE TABLE,ALTER TABLE). MySQL face automatcommitînainte de ea.
Comenzi înrudite
mysqli_commit: Salvează definitiv toate modificările făcute în tranzacția curentă.mysqli_rollback: Anulează toate modificările făcute în tranzacția curentă.mysqli_autocommit: Pornește sau oprește salvarea automată a fiecărei interogări (modul autocommit).mysqli_savepoint: Creează un punct de salvare în tranzacția curentă, la care poți reveni fără să anulezi toată tranzacția.PDO: PDO este interfața PHP comună pentru baze de date: același cod funcționează cu MySQL, PostgreSQL sau SQLite.