Intro og teori
Notater kap. 15–16. Vokabularet for resten av kapittelet — ACID, schedules, conflict-serializability og recoverability. Klikk deg gjennom eksemplene.
De fire garantiene
ACID er ikke fire uavhengige funksjoner — det er fire måter å beskrive samme grunnløfte: en transaksjon ser ut som en atomisk, varig, alenestående endring av en konsistent database.
| Bokstav | Egenskap | Hva den lover | Hvem leverer |
|---|---|---|---|
| A | Atomicity | Alle stegene gjennomføres, eller ingen. Ingen «halvferdige» transaksjoner kan observeres etterpå. | Recovery (undo) |
| C | Consistency | Hver transaksjon tar databasen fra én lovlig tilstand til en annen — PK, FK, CHECK osv. holder. | SQL-modellen + bruker |
| I | Isolation | Selv om mange kjører samtidig, skal effekten være som en eller annen seriell rekkefølge. | Concurrency control (8B) |
| D | Durability | Etter COMMIT overlever resultatet alt — strømbrudd, krasj, OS-kill. | WAL + redo (8C) |
«Consistency» har to betydninger i kurset. I ACID handler det om brukerens integritetskrav. I concurrency control brukes det også om at samtidige effekter er konsistente (samme som serielle). Forelesningen følger første betydning.
Sammenflettede operasjoner
For å kunne snakke matematisk om hva som er lov og ulovlig, abstraherer vi vekk SQL og ser bare på fire operasjoner:
ri(X)— transaksjon i leser dataelement Xwi(X)— transaksjon i skriver dataelement Xci— commit av Tiai— abort av Ti
En schedule (eller historie) er en sekvens av slike operasjoner fra én eller flere transaksjoner. Seriell schedule = ingen interleaving (én transaksjon helt ferdig før neste begynner).
Seriell: r1(A); w1(A); c1; r2(A); w2(A); c2;
Interleaved: r1(A); r2(A); w1(A); w2(A); c1; c2;
Spørsmålet hele dette kapittelet handler om: hvilke interleavede schedules er trygge — det vil si gir samme resultat som en eller annen seriell?
Bankoverføring vs. renteberegning
To transaksjoner kjører samtidig på kontoer A og B (start: A=200, B=100):
- T1 — overfør 100 fra B til A:
r1(B); w1(B = B−100); r1(A); w1(A = A+100); c1; - T2 — gi 6 % rente på begge:
r2(A); w2(A = A·1.06); r2(B); w2(B = B·1.06); c2;
Avhengig av flettingen kan resultatet bli riktig (samme som T1;T2 eller T2;T1) — eller helt feil. Klikk gjennom problemet under:
Når er to operasjoner i konflikt?
Tre vilkår, alle må være oppfylt:
- De tilhører ulike transaksjoner.
- De berører samme dataelement.
- Minst én av dem er en write.
| Par | I konflikt? | Grunn |
|---|---|---|
r1(X), r2(X) | Nei | Begge leser — å bytte rekkefølge endrer ingenting. |
r1(X), w2(X) | Ja | T1 ser ulike verdier avhengig av rekkefølge. |
w1(X), r2(X) | Ja | Samme grunn motsatt vei. |
w1(X), w2(X) | Ja | Sluttverdien er forskjellig. |
r1(X), w2(Y) | Nei | Ulike dataelementer, helt uavhengige. |
r1(X), w1(X) | Nei | Samme transaksjon — ikke en konflikt mellom transaksjoner. |
Intuisjonen: to operasjoner er i konflikt hvis det å bytte rekkefølgen kan gi et annet resultat på databasen.
r1(A); w2(A); w1(A); r2(B); c1; c2;? List dem.r1(A) ↔ w2(A)— ulike Tx, samme element, én er write.w2(A) ↔ w1(A)— to writes på samme element.
r2(B) er alene om B, så ingen konflikt med noe annet. Commits er ikke operasjoner på dataelementer.
Ekvivalent med en seriell
En schedule er serializable hvis det finnes en seriell schedule med samme effekt på databasen. Vi vil ha serializable, ikke seriell — fordi vi vil ha samtidighet uten å gi opp korrekthet.
To viktige underklasser:
- Conflict-serializable — kan omformes til en seriell ved å bytte om nabo-operasjoner som ikke er i konflikt. Strengere, men billig å sjekke (precedence-graf).
- View-serializable — schedulen leser og produserer samme final-state som en seriell. Mer permissiv, men NP-hardt å avgjøre i alminnelighet.
I praksis brukes conflict-serializability overalt fordi 2PL (kapittel 8B) implementerer akkurat den.
Conflict-serializable ⇒ View-serializable ⇒ Serializable. Motsatt vei holder ikke.
Sjekk med presedensgraf
Resepten for å avgjøre om en schedule er conflict-serializable:
- Lag én node per transaksjon.
- For hvert konfliktpar — hvis Ti sin operasjon kommer før Tj sin, tegn en pil Ti → Tj.
- Acyclic graf ⇔ schedule er conflict-serializable. En topologisk sortering gir den ekvivalente serielle rekkefølgen.
Eksempel 1 — uten sykel
Schedule H1: r2(A); r1(B); w2(A); r3(A); w1(B); w3(A); r2(B); w2(B);
Klikk «Vis neste konflikt» for å bygge grafen steg for steg:
T1; T2; T3.T1; T2; T3.
Eksempel 2 — med sykel
Schedule H2: r2(A); r1(B); w2(A); r2(B); r3(A); w1(B); w3(A); w2(B);
Når kan vi angre en abort?
Conflict-serializability handler om resultatet er korrekt hvis ingen aborter. Men aborter skjer hele tiden — deadlocks, krasj, brukervalg. Spørsmålet er: kan vi rulle tilbake en transaksjon uten å ødelegge committed andre?
Recoverable schedule
En schedule er recoverable hvis hver transaksjon Tj som har lest fra Ti, committer etter Ti. Da kan vi alltid rulle tilbake Ti sammen med Tj hvis Ti aborter.
Recoverable: w1(A); w1(B); r2(A); c1; c2;
Ikke-recoverable: w1(A); w1(B); r2(A); c2; c1; ← T2 har committed på T1's data, men T1 kan fortsatt aborte!
Avoid Cascading Aborts (ACA / cascadeless)
En sterkere garanti: en transaksjon leser bare committed verdier. Da slipper vi cascading aborts — situasjoner der én abort tvinger frem flere.
Strict
Sterkest: en transaksjon kan verken lese eller skrive over uncommitted verdier. Dette gjør undo trivielt — vi kan rulle tilbake bare ved å skrive «before-image» tilbake.
w1(A); w2(A); c1; c2; — er den recoverable? Cascadeless? Strict?Cascadeless: Ja, av samme grunn — T2 leste ingenting uncommitted.
Strict: Nei. T2 skrev over en uncommitted verdi (w1(A)). Hvis T1 aborterer, kan vi ikke gjenopprette w1(A) ved bare å bruke before-image — T2 har allerede skrevet på toppen.
Set-relasjonen mellom schedule-klasser
Klassene former et strengt hierarki — strengere lenger ned betyr færre tillatte schedules, mer trygghet, men også mindre samtidighet.
Strict ⊂ ACA ⊂ Recoverable ⊂ Alle schedules
Tilsvarende har vi for samtidighet: Seriell ⊂ Conflict-serializable ⊂ View-serializable ⊂ Alle schedules. De to hierarkiene er ortogonale — recoverability handler om aborter, serializability om samtidighet.
Kort oppsummert
- ACID = Atomicity, Consistency, Isolation, Durability. Fire garantier som henger sammen.
- En schedule er en sekvens av
r/w/c/a-operasjoner fra flere transaksjoner. - To operasjoner er i konflikt hvis de tilhører ulike Tx, samme element, og minst én er write.
- Conflict-serializable = kan omformes til seriell ved å bytte ikke-konflikt-naboer ⇔ presedensgraf er acyklisk.
- Recoverable ⊃ cascadeless (ACA) ⊃ strict. Strict gjør undo trivielt.
- Praksisstandard: conflict-serializable + strict — leveres «gratis» av strict 2PL.
Klar for neste? 8B · Samtidighet og låser →