Ce face mysqli_savepoint
Un punct de salvare (savepoint) marchează un moment din tranzacție. Cu comanda SQL ROLLBACK TO SAVEPOINT nume anulezi doar modificările făcute după acel punct; cele de dinainte rămân și pot fi salvate cu mysqli_commit.
Funcția rulează comanda SAVEPOINT nume. Are sens doar într-o tranzacție pornită.
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. |
$name |
Numele punctului de salvare. |
Ce returnează
true la succes.
Exemple
Exemplul 1: Anulare parțială
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_begin_transaction($conn);
mysqli_query($conn, "UPDATE produse SET pret = 70 WHERE id = 2");
mysqli_savepoint($conn, "dupa_mouse");
mysqli_query($conn, "UPDATE produse SET pret = 1 WHERE id = 1");
mysqli_query($conn, "ROLLBACK TO SAVEPOINT dupa_mouse");
mysqli_commit($conn);
foreach (mysqli_query($conn, "SELECT nume, pret FROM produse WHERE id IN (1, 2) ORDER BY id") as $r) {
echo "{$r['nume']}: {$r['pret']} lei\n";
}
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Laptop: 3200 lei
Mouse: 70 lei
Greșeli frecvente
- Creezi un punct de salvare fără tranzacție, în modul autocommit. Comanda reușește, dar punctul dispare imediat, pentru că fiecare interogare se salvează singură.
Comenzi înrudite
mysqli_release_savepoint: Șterge un punct de salvare din tranzacția curentă, fără să anuleze sau să salveze modificări.mysqli_rollback: Anulează toate modificările făcute în tranzacția curentă.mysqli_begin_transaction: Începe o tranzacție: modificările următoare se salvează toate împreună cu commit sau se anulează toate cu rollback.