mysqli_savepoint în PHP

Creează un punct de salvare în tranzacția curentă, la care poți reveni fără să anulezi toată tranzacția.

Sintaxă
mysqli_savepoint(mysqli $mysql, string $name): bool

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.