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
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 fosseAlles 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.
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
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:
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 confermatoZUUR 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
COMMITgaat niet verloren, zelfs niet bij een crash.
Jouw beurt
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.
Toon hint
Referentievoorraad - 1 en voorraad + 1 in de respectieve SET-clausules.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
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').
Toon hint
ROLLBACK annuleert elke wijziging die vanaf BEGIN wordt aangebracht.
Oplossing beschikbaar na 3 pogingen