Ce face SAVEPOINT
SAVEPOINT nume marchează un punct în tranzacție. ROLLBACK TO nume anulează tot ce s-a făcut după acel punct, dar păstrează ce era înainte și lasă punctul activ, ca să poți încerca din nou. RELEASE nume „închide” punctul și păstrează modificările.
Punctele de salvare se pot imbrica, spre deosebire de BEGIN. Sunt utile în funcții care nu știu dacă au fost apelate din interiorul unei tranzacții: fiecare își deschide propriul SAVEPOINT.
Dacă dai SAVEPOINT fără o tranzacție deschisă, el începe o tranzacție, iar RELEASE pe ultimul punct face COMMIT. Un COMMIT sau ROLLBACK obișnuit închide toată tranzacția, cu toate punctele ei.
Parametri
| Parametru | Descriere |
|---|---|
nume |
Numele punctului; poate fi refolosit, caz în care se referă la cel mai recent. |
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE note (elev TEXT, materie TEXT, nota INTEGER CHECK (nota BETWEEN 1 AND 10));
Exemplul 1: Anulezi doar ultima parte
Notele Anei rămân; notele lui Mihai, adăugate după punctul mihai, sunt anulate, apoi tranzacția este confirmată.
BEGIN;
INSERT INTO note VALUES ('Ana', 'Matematică', 9), ('Ana', 'Română', 10);
SAVEPOINT mihai;
INSERT INTO note VALUES ('Mihai', 'Matematică', 7);
ROLLBACK TO mihai;
RELEASE mihai;
COMMIT;
SELECT * FROM note ORDER BY elev, materie;
Rezultat
╭──────┬────────────┬──────╮
│ elev │ materie │ nota │
╞══════╪════════════╪══════╡
│ Ana │ Matematică │ 9 │
│ Ana │ Română │ 10 │
╰──────┴────────────┴──────╯
Exemplul 2: Puncte imbricate
ROLLBACK TO exterior anulează și tot ce a fost după punctul interior, pentru că acesta a fost creat după exterior. Punctul exterior rămâne activ, iar RELEASE pe el confirmă tot (aici nu există BEGIN, deci SAVEPOINT a început tranzacția).
SAVEPOINT exterior;
INSERT INTO note VALUES ('Elena', 'Fizică', 8);
SAVEPOINT interior;
INSERT INTO note VALUES ('Elena', 'Chimie', 6);
RELEASE interior;
SELECT count(*) AS inainte FROM note;
ROLLBACK TO exterior;
INSERT INTO note VALUES ('Elena', 'Fizică', 9);
RELEASE exterior;
SELECT * FROM note;
Rezultat
╭─────────╮
│ inainte │
╞═════════╡
│ 2 │
╰─────────╯
╭───────┬─────────┬──────╮
│ elev │ materie │ nota │
╞═══════╪═════════╪══════╡
│ Elena │ Fizică │ 9 │
╰───────┴─────────┴──────╯
Greșeli frecvente
- Crezi că
ROLLBACK TOînchide punctul. Punctul rămâne activ: termină-l cuRELEASE, altfel tranzacția rămâne deschisă. - Folosești
ROLLBACK TOcu un nume care nu există și primeștino such savepoint. Numele trebuie să fie al unui punct încă activ.
Comenzi înrudite
BEGIN, COMMIT, ROLLBACK: Grupează mai multe modificări într-o tranzacție: fie se salvează toate cu COMMIT, fie niciuna cu ROLLBACK.SQLite din Python (sqlite3): Modulul sqlite3 din biblioteca standard Python: conectare, interogări cu parametri, tranzacții și rânduri ca dicționare.INSERT OR IGNORE / OR REPLACE: Alege ce face SQLite când un INSERT sau UPDATE încalcă o constrângere: oprește comanda, sare peste rând sau înlocuiește rândul vechi.