Direct naar de hoofdinhoud
Module 8 · Les 4 van 432/57 in de cursus~10 min
Modulelessen (4/4)

Transacties: alles of niets

Een transactie is een groep bewerkingen die door de database worden behandeld één enkele eenheid: ze slagen allemaal, of geen van hen blijft over spoor. Zo bescherm je jezelf tegen inconsistenties in een reeks van UPDATE/INSERT/DELETE moet consistent blijven.

De syntaxis

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

Alles tussen BEGIN en COMMIT is atomair: geen andere verbinding ziet de tussentoestand. Als het programma crasht of wordt uitgevoerd ROLLBACK, de database blijft precies zoals deze was vóór BEGIN.

Het klassieke scenario: de overdracht

Het canonieke voorbeeld is een aandelenoverdracht tussen producten (of een geldoverdracht). overdracht tussen accounts): twee UPDATEs die samen moeten slagen, nooit de een ja en de ander nee.

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

Als de tweede UPDATE mislukt (bijvoorbeeld een CHECK beperkingsfout), ROLLBACK herstelt de voorraad van product 1 naar de oorspronkelijke waarde.

ROLLBACK: de debugger van de DBA

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

Een zeer nuttig patroon voor het uitproberen van een UPDATE op echte gegevens: jij voer het uit, inspecteer het resultaat met een SELECT in dezelfde transactie, en als het je niet overtuigt, ROLLBACK — de database is precies zoals het was eerder.

SAVEPOINT: gedeeltelijk terugdraaien

Binnen een transactie kunt u tussenpunten creëren:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

ZUUR in 30 seconden

Transacties garanderen de ACID-eigenschappen:

  • Atomiciteit — alles of niets;
  • Cconsistentie — er wordt aan de beperkingen voldaan aan het begin en het einde van de transactie;
  • Isolatie — gelijktijdige transacties zien geen tussenliggende toestanden (op verschillende "niveaus");
  • **Duurzaamheid — een succesvolle COMMIT gaat niet verloren, zelfs niet bij een crash.

Jouw beurt

Oefening#sql.m8.l4.e1
Pogingen: 0Laden…

In één transactie: verlaag de voorraad van product 1 met 1 en verhoog de voorraad van product 2 met 1. Open met BEGIN en sluit af met COMMIT.

Editor laden…
Toon hint

Referentievoorraad - 1 en voorraad + 1 in de respectieve SET-clausules.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m8.l4.e2
Pogingen: 0Laden…

Open een transactie, probeer de stad van de klant met id=1 bij te werken naar 'Sperimentale' en annuleer vervolgens de transactie met ROLLBACK. Uiteindelijk moet de stad van klant 1 de originele zijn ('Milaan').

Editor laden…
Toon hint

ROLLBACK annuleert elke wijziging die vanaf BEGIN wordt aangebracht.

Oplossing beschikbaar na 3 pogingen