Modulelessen (1/4)
ACID-transacties (BEGIN/COMMIT)
De basis van de betrouwbaarheid van elke database berust op het acroniem ACID:
- Atomiciteit: een bewerking wordt volledig voltooid (Commit) of mislukt en laat geen half voltooide sporen achter (Rollback).
- Cconsistentie: de databaseregels (bijv. beperkingen, Foreign Keys) worden altijd gerespecteerd.
- Isolatie: transacties die tegelijkertijd plaatsvinden, interfereren niet op ongecontroleerde wijze met elkaar.
- **Duurzaamheid: na een commit wordt de wijziging onomkeerbaar naar schijf geschreven.
Transactiesyntaxis
Normaal gesproken wordt elke afzonderlijke UPDATE- of DELETE-query behandeld als een op zichzelf staande transactie (autocommit). Maar als u meerdere handelingen wilt groeperen, bijvoorbeeld het debiteren van de rekening van de klant en het plaatsen van de bestelling, moet u dit expliciet doen met behulp van transactiesyntaxis.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesAls tijdens deze complexe uitvoeringen de JavaScript-app die de query heeft verzonden zich realiseert dat er een probleem is (er is bijvoorbeeld niet genoeg voorraad in het magazijn en deze crasht), dan verzendt deze een:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockProbeer het zelf
Open een transactie.\nUpdate het product met ID 10 en stel de 'hoeveelheid' in op 0 in de tijdelijke tabel (nee wacht, 'hoeveelheid' staat niet op producten, laten we iets bedenken: wijzig 'eenheidsprijs' in 'order_items' maar dat vereist een beperking.\nLaten we het beter doen: update de status van bestelling-ID 5 naar 'verzonden' en voltooi de transactie met succes.
Toon hint
Begin met BEGIN;, wijzig bestellingen voor id = 5 naar status='verzonden', en verzend het vervolgens met COMMIT;
Oplossing beschikbaar na 3 pogingen
Paniek in de productie! Een ontwikkelaar schreef een DELETE zonder de WHERE, waarbij historisch gezien alle recensies werden gewist.\nLaten we ze laten zien hoe het terugdraaien wordt gedaan. Start een transactie, voer een snelle DELETE uit die alles van 'reviews' wist (zonder WHERE-clausule), maar gebruik vervolgens de SQL-redder om de impact ongedaan te maken voordat het blok is voltooid.
Toon hint
BEGIN;, de schone lei verwijderen bij 'reviews', en dan de magische ROLLBACK; aan het einde.
Oplossing beschikbaar na 3 pogingen