Notater kap. 15–16. Vokabularet for resten av kapittelet — vi introduserer ACID-egenskapene, hva en schedule (rekkefølge av operasjoner) er, og når en sammenfletting er trygg. Klikk deg gjennom eksemplene.
01 · ACID
De fire garantiene
ACID står for Atomicity, Consistency, Isolation, Durability — de fire garantiene en transaksjon gir. Det er ikke fire uavhengige funksjoner, men 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.
Samtidighetskontroll — låser/MVCC (forklart i 8B)
D
Durability
Etter COMMIT overlever resultatet alt — strømbrudd, krasj, hvis operativsystemet dreper databaseprosessen.
Logging og redo etter krasj (forklart i 8C)
Merk
«Consistency» har to betydninger i kurset. I ACID handler det om brukerens integritetskrav. I samtidighetskontroll (concurrency control) brukes det også om at samtidige effekter er konsistente (samme som serielle). Forelesningen følger første betydning.
Sjekk forståelsen · ACID
En transaksjon overfører 100 kr fra konto A til B. Maskinen krasjer rett etter at A er trukket, men før B er kreditert. Etter recovery er A og B begge tilbake til startverdiene. Hvilken egenskap er nettopp demonstrert?
AAtomicity — alt-eller-ingenting holdt selv ved krasj
BConsistency — saldoen er konsistent
CIsolation — ingen andre så halvferdig overføring
DDurability — endringene overlevde
Atomicity. Recovery rullet tilbake en halvferdig transaksjon — det er definisjonen av «alt eller ingenting». Durability ville handlet om at en committed overføring overlevde. Konsistens følger som konsekvens, men er ikke det som ble demonstrert direkte.
02 · Schedule
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 X
wi(X) — transaksjon i skriver dataelement X
ci — commit av Ti (transaksjonen erklærer seg ferdig og endringene blir permanente)
ai — abort av Ti (transaksjonen avbrytes og endringene rulles tilbake)
Når vi vil vise hvilken verdi som skrives, bruker vi notasjonen wi(X = uttrykk) — for eksempel w1(B = B−100) betyr at T1 skriver verdien B−100 til B.
En schedule (eller historie) er en sekvens av slike operasjoner fra én eller flere transaksjoner. Seriell schedule = ingen sammenfletting (én transaksjon helt ferdig før neste begynner).
(I løpetekst skriver vi r1(A) i stedet for r1(A) for å spare plass — det er samme.)
Spørsmålet hele dette kapittelet handler om: hvilke sammenflettede (interleavede) schedules er trygge — det vil si gir samme resultat som en eller annen seriell?
Sjekk · Schedule
Hva betyr at en schedule er seriell?
ADen kjører fortest mulig
BDen fletter ikke operasjoner fra forskjellige transaksjoner — én transaksjon ferdig før neste begynner
CDen bruker ingen låser
DAlle operasjoner er reads
Riktig. En seriell schedule kjører transaksjoner én etter én, uten interleaving. Vi ønsker ikke serielle schedules i praksis — de gir for lite samtidighet — men de tjener som korrekthetsreferanse: en ekvivalent seriell schedule er definisjonen på serializability.
03 · Eksempel
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:
Steg
T1 — overfør
T2 — rente
1
r1(B) → 100
·
2
w1(B = 0)
·
3
·
r2(A) → 200
4
·
w2(A = 212)
5
·
r2(B) → 0
6
·
w2(B = 0)
7
·
c2
8
r1(A) → 212
·
9
w1(A = 312)
·
10
c1
·
Konto A200
Konto B100
Trykk «Neste» for å starte.
Steg 0 / 10
Foregriper
Vi vil komme tilbake til nøyaktig dette eksempelet i seksjonene 04–06: schedulen har to konfliktende lese/skrive-mønstre på samme dataelement — T1 sin w1(B) kommer før T2 sin r2(B), mens T2 sin w2(A) kommer før T1 sin r1(A). Disse to «motgående» avhengighetene er det som gjør schedulen umulig å gjenskape serielt. Når vi har lært presedensgraf, vil vi se denne sykelen formelt.
Sjekk · Bankeksempel
I steget over ble «overføringens andre halvdel» (innskuddet på A) klemt mellom T2 sine to operasjoner. Hva er navnet på selve fenomenet — at T2 så A før T1 var ferdig?
ADirty read (T2 leste en ucommitted verdi fra T1)
BInkonsistent / feil resultat — schedulen er ikke serializable
CPhantom read (et nytt rad-sett dukket opp underveis)
DDirty write (T2 overskrev en ucommitted verdi fra T1)
Ikke-serializable. «Dirty read» ville krevd at T2 leste en uncommitted verdi fra T1 — her leste T2 bare gamle (committed) verdier. Likevel er resultatet ikke ekvivalent med noen seriell ordning. Vi skal lære navnet på de spesifikke anomaliene (typiske feilmønstre som oppstår uten samtidighetskontroll) i 8B; her holder det å se at noe er galt.
04 · Conflict
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.
Tenk selv · Konflikt
Hvor mange par er i konflikt i schedulen r1(A); w2(A); w1(A); r2(B); c1; c2;? List dem.
To par.
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.
Sjekk · De tre vilkårene
Hvilket av disse parene er ikke i konflikt?
Ar1(X) og w2(X)
Bw1(Y) og w3(Y)
Cr2(A) og w2(A)
Dw1(B) og r2(B)
Riktig — C. Begge operasjonene tilhører T2, og det første vilkåret («ulike transaksjoner») er ikke oppfylt. Internt i én transaksjon bestemmer programmet rekkefølgen — det er ikke en konflikt mellom transaksjoner. A, B og D oppfyller alle tre vilkårene: ulike Tx, samme element, minst én write.
05 · Serializability
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.
Pensum bruker en presis underklasse — conflict-serializable:
To historier er konfliktekvivalente hvis de har samme rekkefølge for konfliktoperasjoner.
En historie er conflict-serializable hvis den er konfliktekvivalent med en eller annen seriell historie.
Dette er det vi sjekker mekanisk — typisk via en presedensgraf (neste seksjon).
Conflict-serializability impliserer serializability, men ikke omvendt. 2PL (two-phase locking — forklart i 8B) implementerer nettopp conflict-serializability.
Sjekk · Serializability
Hvilken sammenheng er korrekt?
ASerializable ⇒ conflict-serializable (men ikke omvendt)
BConflict-serializable ⇒ serializable (men ikke omvendt)
CDe to begrepene er identiske
DConflict-serializable ⇒ seriell
Riktig. Conflict-serializability er en strengere (mer restriktiv) klasse enn serializability — alle conflict-serializable schedules er serializable, men noen serializable schedules er ikke conflict-serializable. Vi sjekker conflict-serializability fordi det er mekanisk avgjørbart via presedensgraf, mens generell serializability er NP-hardt.
06 · Algoritmen
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.
Klikk «Vis neste konflikt» for å bygge grafen steg for steg:
r2(A)r1(B)w2(A) — konflikt med r2(A)? nei (samme Tx)r3(A) — konflikt med w2(A): T2→T3w1(B) — w1(B) konfliktbygger med kommende r2(B): T1→T2w3(A) — konflikter med r2(A), w2(A) men disse er allerede dekketr2(B) — leser etter w1(B): T1→T2 (allerede)w2(B)
Resultat: T1 → T2 → T3. Ingen sykel — schedulen er conflict-serializable, ekvivalent med seriell T1; T2; T3.
Acyclic ✓ — graf har ingen sykel. H1 er conflict-serializable, og topologisk sortering gir serielle ordning T1; T2; T3.
Sykel T1 → T3 → T2 → T1. Ikke conflict-serializable. Ingen seriell ordning gir samme resultat.
Bla gjennom kortene under for å øve på å lese presedensgrafer. Klikk et svaralternativ for å se forklaringen.
Tastatur: ← forrige · → neste · Enter/Space snu kort
1 / 0
Presedensgraf · acykliskLett
En presedensgraf er acyklisk og har kantene T2→T1, T2→T3, T1→T3. Hvilken seriell ordning er schedulen ekvivalent med?
A T1; T2; T3
B T2; T1; T3
C T3; T1; T2
D Ingen — kantene gir ikke nok info
Riktig svar: B
Riktig: B — T2; T1; T3.
En topologisk sortering må respektere alle kantene: T2 før T1, T2 før T3, T1 før T3. Den eneste rekkefølgen som tilfredsstiller alle tre samtidig er T2; T1; T3.
Topologisk sortering av en acyklisk graf gir alltid minst én gyldig seriell ordning. Hvis flere ordninger er mulige, er alle ekvivalente.
Presedensgraf · sykelLett
En presedensgraf for fire transaksjoner har kanter T1→T2, T2→T3, T3→T4, T4→T1. Hva betyr dette?
A Schedulen er conflict-serializable; ordningen er T1, T2, T3, T4
B Det er en sykel — schedulen er ikke conflict-serializable
C Schedulen er serializable men ikke conflict-serializable
D Det betyr at minst to transaksjoner må aborteres
Riktig svar: B
Riktig: B — sykel ⇒ ikke conflict-serializable.
Vi kan ikke topologisk sortere en syklisk graf. Det betyr ikke automatisk at noen må aborteres (D) — det betyr bare at denne schedulen ikke er ekvivalent med en seriell. Schedulen skal forhindres på forhånd (typisk av 2PL i 8B).
(C) blander sammen klassene: conflict-serializability er strengere enn serializability, så «ikke conflict-serializable» innebærer ikke automatisk «serializable likevel».
Konfliktparene er r1(A) ↔ w2(A) og r1(B) ↔ w2(B). I begge tilfeller kommer T1 sin operasjon før T2 sin, så vi tegner T1→T2. Vi tegner aldri samme kant to ganger — kanten finnes eller ikke.
Acyklisk ⇒ schedulen er conflict-serializable, ekvivalent med seriell T1; T2.
Presedensgraf · ekvivalenteMiddels
En graf har kantene T1→T2 og T1→T3 (ingen kant mellom T2 og T3). Hvor mange ekvivalente serielle ordninger finnes?
A Én — bare T1; T2; T3
B To — T1; T2; T3 og T1; T3; T2
C Tre — alle permutasjoner som starter med T1
D Schedulen er ikke conflict-serializable
Riktig svar: B
Riktig: B — to ordninger.
T1 må komme før både T2 og T3, men det finnes ingen kant mellom T2 og T3, så de er uavhengige. Begge T1; T2; T3 og T1; T3; T2 respekterer alle kantene.
Generelt: når en acyklisk graf har flere topologiske sorteringer, er alle ekvivalente serielle ordninger for schedulen.
07 · Recoverability
Når kan vi angre en abort?
Conflict-serializability handler om resultatet er korrekt hvis ingen aborter. Men aborter skjer hele tiden — deadlock (to transaksjoner som venter på hverandres låser — forklares i 8B), krasj, brukervalg. Spørsmålet er: kan vi rulle tilbake en transaksjon uten å ødelegge committed andre?
«Read-from»-relasjonen
Vi sier at Tj leser fra Ti (skrives Ti → Tj via X) hvis:
Ti skriver X (wi(X)),
Tj leser X etterpå (rj(X)),
og ingen annen transaksjon skriver X mellom disse to operasjonene.
Det er denne relasjonen vi bruker når vi resonnerer om recoverable, cascadeless og strict.
Recoverable schedule
En schedule er recoverable hvis: for hvert par der Tj leser fra Ti, committer Tifør Tj committer. 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» (verdien som lå der før endringen) tilbake.
Tenk selv · Recoverable
Schedule: w1(A); w2(A); c1; c2; — er den recoverable? Cascadeless? Strict?
Recoverable: Ja. T2 leste ikke noe fra T1 — T2 skrev bare. Recoverable trenger bare commit-rekkefølgen for read-from. 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.
Bla gjennom kortene for å øve på å klassifisere schedules i hierarkiet Strict ⊂ ACA ⊂ Recoverable. Velg sterkeste klasse schedulen tilhører.
Tastatur: ← forrige · → neste · Enter/Space snu kort
1 / 0
Klassifisering · disjunkte dataLett
Schedule: r1(A); r2(B); w1(A); w2(B); c1; c2; — hva er den sterkeste klassen den tilhører?
A Strict
B ACA, men ikke strict
C Recoverable, men ikke ACA
D Ikke recoverable
Riktig svar: A
Riktig: A — Strict.
T1 og T2 jobber på ulike dataelementer (A og B). Ingen leser eller skriver over en uncommitted verdi — det finnes ingen kryss-konflikt i det hele tatt. Dermed holder strict trivielt, og strict ⇒ ACA ⇒ recoverable.
Klassifisering · skriv over uncommittedMiddels
Schedule: w1(A); w2(A); c1; r2(A); c2; — hva er den sterkeste klassen?
A Strict
B ACA, men ikke strict
C Recoverable, men ikke ACA
D Ikke recoverable
Riktig svar: B
Riktig: B — ACA, men ikke strict.
Ikke strict: T2 skriver A mens T1 fortsatt er uncommitted (w2(A) før c1) — strict forbyr å skrive over uncommitted verdier.
ACA holder: T2 leser A først etter at T1 har committed. T2 leser aldri en uncommitted verdi.
Recoverable: trivielt, siden T2 ikke leser fra T1.
Klassifisering · les uncommittedMiddels
Schedule: w1(A); r2(A); w2(B); c1; c2; — hva er den sterkeste klassen?
A Strict
B ACA, men ikke strict
C Recoverable, men ikke ACA
D Ikke recoverable
Riktig svar: C
Riktig: C — Recoverable, men ikke ACA.
Ikke ACA: T2 leser A før T1 har committed (r2(A) etter w1(A), før c1). T2 leser en uncommitted verdi — hvis T1 aborterer, må T2 også abortes (cascading).
Recoverable holder: T1 committer før T2. Da kan vi alltid rulle tilbake T1 sammen med T2 hvis T1 aborterer før c1.
Klassifisering · feil commit-rekkefølgeVanskelig
Schedule: w1(A); r2(A); w2(B); c2; c1; — hva er den sterkeste klassen?
A Strict
B ACA, men ikke strict
C Recoverable, men ikke ACA
D Ikke recoverable
Riktig svar: D
Riktig: D — ikke recoverable.
T2 leser fra T1 (r2(A) etter w1(A), ingen annen Tx skriver A imellom), og T2 committer før T1. Hvis T1 nå aborterer, har T2 allerede committed på en verdi som ikke skulle eksistere — vi kan ikke rulle T2 tilbake.
Recoverable krever nettopp at den «leser-fra»-skrivende transaksjonen committer først.
08 · Hierarkiet
Set-relasjonen mellom schedule-klasser
Klassene former et strengt hierarki — strengere lenger ned betyr færre tillatte schedules, mer trygghet, men også mindre samtidighet.
Alle schedulesmatematisk univers
Recoverableaborter ødelegger ikke committed Tx
Cascadeless (ACA)les bare committed verdier
Strictverken les eller overskriv uncommitted
Strict ⊂ ACA ⊂ Recoverable ⊂ Alle schedules
Tilsvarende for samtidighet: Seriell ⊂ Conflict-serializable ⊂ Serializable ⊂ Alle schedules. De to hierarkiene er ortogonale — recoverability handler om aborter, serializability om samtidighet.
Sjekk · Hierarki
Hvilken kombinasjon vil de fleste kommersielle SQL-databaser i praksis garantere?
Conflict-serializable + strict. Strict 2PL (kapittel 8B — en variant av two-phase locking) gir akkurat denne kombinasjonen automatisk: 2PL ⇒ conflict-serializable, og «hold X-låser til commit/abort» ⇒ strict. (Du møter strict 2PL og X-låser i 8B — her holder det å vite at det finnes en variant av 2PL som leverer både korrekthet og enkel rollback.)
09 · Oppsummering
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.