Transaksjoner
Transaksjoner, kap. 20-22 Svein Erik Bratsberg, IDI/NTNU Versjon 21.april 2022
Innhold
- Kap. 20
- Hvorfor transaksjoner?
- Transaksjoner og SQL
- Transaksjonsteori
- Kap. 21
- Flerbrukerkontroll (CC)
- Korrekthet
- LÄsing
- Multiversjons-CC
- Kap. 22
- Logging og recovery
- Abortering av transaksjoner
- Krasjrecovery
Hvorfor transaksjoner?
- StĂžtter deling og samtidig aksess av data
- Flerbrukerkontroll: Kap. 20 og 21
- StÞtter sikker, pÄlitelig, atomisk aksess til store mengder data
- Recovery: Kap. 20 og 22
Databaseoperasjoner (20.1.2)
- X - databaseobjekt: post eller blokk
- read(X)
- r(X)
- write(X)
- w(X)
- TilhĂžrende transaksjon 1
- read1(X)
- r1(X)
- Commit1 c1 suksess: avslutting av transaksjon 1
- Abort1 a1 abortering av transaksjon 1
Samtidighetsproblemer, eksempel (20.1.3)
- To transaksjoner
Samtidighetsproblemer (2)
- r1(A); w1(A); r2(A); w2(A); r2(B); w2(B); r1(B); w1(B);
Samtidighetsproblemer, klasser (20.1.3)
- Dirty read (Lese data som er skrevet til men ikke committet)
- Lost update / dirty write (Overskrive data som ikke er committet)
-
Example: Lost update / dirty write
- w1(buyer=âAliceâ); w2(buyer=âBobâ); w2(invoice=âBobâ); w1(invoice=âAliceâ);
-
Unrepeatable read (Data endret mellom to reads i samme transaksjon (eks. i nested loop join))
- Incorrect summery
- En transaksjon beregner en aggregatfunksjon mens en annen gjĂžr en oppdatering
- Figur 20.3 (c)
Incorrect summary
Oppgave
- Se pÄ fÞlgende historier:
- H1: r1(A); w1(A); r1(B); w2(A); w2(B); w1(B); c1; c2;
- H2: r1(A); w1(A); r2(A); w2(A); c2; r1(B); a1;
- Hva er problemene for H1 og H2?
- Unrepeatable read
- Dirty read
- Lost update
Hvorfor trenger vi recovery?
- To typer recovery (gjenoppretting)
- En transaksjon ruller tilbake (rollback, abortering)
- Uventet situasjon
- Manglende data
- Brukeren bestemmer det
- Samtidighetskontrollen bestemmer det (CC, concurrency control)
- Systemkrasjrecovery
- Databasesystemet, OSâet eller datamaskinen krever en restart
ACID - egenskaper ved en transaksjon
Transaksjon: en gruppering av operasjoner mot databasen som er
- A - atomiske: enten kjÞrer de fullstendig, eller sÄ kjÞrer de ikke
- C - consistency: overholder konsistenskrav (primary key, references, check, osv)
- I - isolation: som er isolert fra hverandre. Merker ikke at noen kjĂžrer samtidig.
- D - durability: er permanente, dvs. mistes ikke etter commit.
En transaksjon er vanligvis en logisk operasjon eller oppgave
Eksempler pÄ transaksjoner
- En gruppering av operasjoner mot databasen
- Banktransaksjon
- Tegn en polylinje
- Fyll ut et skjema
- Lever en eksamen
- Setter inn poster som har indekselementer som ogsÄ mÄ oppdateres
- âŠ..
Commit/Abort (20.2.2/20.2.3)
- En transaksjon slutter med
- COMMIT: Alt gikk bra og endringene fra transaksjonen finnes i databasen. Connection.commit();
- ROLLBACK (abort): Transaksjonen rulles tilbake (aborteres) og ingen endringer fra transaksjonen finnes i databasen. Connection.rollback();
- Autocommit: Hver SQL-setning er en egen transaksjon. Kan skrus pÄ. Default av i Python/SQLite3-API. Settes via isolation_level i connection-objektet.
Commit/abort (2)
SET AUTOCOMMIT=0;
UPDATE Account SET b = b - 1000 WHERE id=123123;
UPDATE Account SET b = b + 1000 WHERE id=234234;
COMMIT;
Ekt-eksempel RegMÄlCtrl
INSERT INTO Reg VALUES (1,123123,31,100);
INSERT INTO Reg VALUES (2,123123,32,120);
âŠ.
INSERT INTO Reg VALUES (9,123123,175,245);
UPDATE Loper SET status = âokâ
WHERE brikkenr=123123;
COMMIT;
SQLs isolasjonsnivÄ
SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED
READ COMMITTED
REPEATBALE READ
SERIALIZABLE (default)
- Mer isolasjon/ «korrekthet» nedover
- Mindre samtidighet nedover
- Egenskaper vi vil unngÄ:
- Dirty read
- Unrepeatable read
- UnngÄ fantomer: Hvis T leser en mengde verdier basert pÄ en sÞkebetingelse, sÄ vil ikke denne mengden endres av andre fÞr T er ferdig. Aktuelt ved reskanning (nested loop f.eks.)
SQLs isolasjonsnivÄ (2)
Quiz 1
- Hvorfor mÄ en transaksjon rulles tilbake?
- Tabellen er ikke pĂ„ 1. normalform â
- Samtidighetskontrollen bestemte det â
- Pga. dirty read â
- Brukeren angret seg â
- ACID betyr
- Atomicity, Concurrency, Isolation, Durability â
- Atomicty, Consistency, Isolation, Database â
- Attribute, Consistency, Isolation, Durability â
- Atomicity, Consistency, Isolation, Durability â
- Hva er AUTOCOMMIT?
- Databasen har en konsistent tilstand â
- SQL commiter nĂ„r loggen er full â
- Hver SQL-setning er en egen transaksjon â
- Du har bestemt deg for bilkjĂžpet â
- Hva er problemet med SERIALIZABLE?
- Du fĂ„r mye dirty read â
- Tillater lite samtidighet â
- Svak isolasjon â
- Vanskelig Ă„ fĂ„ til DURABILITY â
READ COMMITTED
- When reading from the database, you will only see data that has been committed (no dirty reads).
- When writing to the database, you will only overwrite data that has been committed (no dirty writes).
READ COMMITED default in Oracle, MS SQL Server and PostgresSQL. There are two ways used to support this.
- Locking. The transaction sets write locks before writing a data item. Release of this lock is done at commit of the transaction. Before reading an item, the transaction sets a read lock on the item, but this read lock is released after the read is done.
- Snapshot isolation. Most databases prevent dirty reads by keeping old values for writes until the transactions commit. Read transactions may read the old value. Only when the new value is committed do transactions switch over to reading the new value. To keep single record locks would cost too much, since one writer may cause multiple readers to wait. This is also called multi-version concurrency control.
Repeatable Read
- Solve the problems of re-reading some items
- Usually supported by snapshot isolation (as previously)
- Real confusion in commercial databases on the use of the terms SERIALIZABLE and REPEATABLE READ
Transaksjonshistorie (20.4.1)
- Historie (schedule)
- Liste av aksjoner (read, write, abort, commit) for en mengde transaksjoner
Fra figur 20.3 a) og b):
Ha: r1(X);r2(X);w1(X);r1(Y);w2(X);w1(Y);
Hb: r1(X);w1(X);r2(X);w2(X),r1(Y);a1;
Transaksjonshistorie - konflikt
- To operasjoner fra en historie er i konflikt hvis
- (1) de tilhĂžrer forskjellige transaksjoner
- (2) de bruker samme dataelement
- (3) minst en av operasjonene er en write
- Eksempler
- Ha: r1(X) og w2(X) er i konflikt
- Ha: w1(X) og w2(X) er i konflikt
- Ha: r1(X) og r2(X) er ikke i konflikt
- To operasjoner er i konflikt hvis endring av rekkefÞlgen endrer resultatet pÄ databasen
Transaksjoner og gjenopprettbarhet (20.4.2)
- Gjenopprettbar historie (recoverable schedule): Hver transaksjon committer etter at transaksjoner de har lest fra har committet.
- H1: w2(A); w1(B); w1(A); r2(B); c1; c2;
- ACA (avoid cascading abort) Historier som unngÄr galopperende abort: NÄr transaksjoner kun kan lese verdier skrevet av committede transaksjoner.
- H1 er ikke ACA.
- H2: w1(A); w1(B); w2(A); c1; r2(B); c2;
- Strikt historie: NÄr transaksjonene verken kan lese eller skrive ikke-committede verdier
- H3: w1(A); r1(B); w2(B); c; w2(A); c2;
- Kan gjĂžre undo recovery ved before image fra loggen
- Sammenheng:
- Strikt ACA Gjenopprettbar Alle historier
Oppgaver
Historier og serialiserbarhet (20.5.1)
- Seriell historie
- Historie som ikke fletter operasjoner fra forskjellige transaksjoner. KjĂžrer etter hverandre
- Serialiserbar historie
- Historie som har samme effekt pÄ databasen som en seriell historie (resultatekvivalent)
- Figur 20.5
Historier og serialiserbarhet (2)
- Vi Ăžnsker serialiserbare og ikke kreve serielle historier fordi vi Ăžnsker samtidighet
- Parallelle trÄder
- Diskaksess - andre trÄder kan jobbe sÄ lenge
Konfliktserialiserbarhet (20.5.1)
- Konflikt mellom to operasjoner
- r1(A) og w2(A)
- w1(A) og r2(A)
- w1(A) og w2(A)
- To historier er konfliktekvivalente hvis de har samme rekkefĂžlge for operasjoner med konflikt
- En historie er konfliktserialiserbar hvis den er konfliktekvivalent med en seriell historie
- Konfliktserialiserbarhet impliserer serialiserbarhet, men ikke nĂždvendigvis motsatt
- Figur 20.5 c) og d)
Konfliktserialiserbarhet
Presedensgraf (20.5.2)
- Rettet graf
- Noder: transaksjoner i historie H
- Kanter: T1 -> T2 finnes nÄr det finnes en operasjon i T1 som er i konflikt med en operasjon i T2, og T1s operasjon skjer fÞr T2s operasjon
- Hvis en presendensgraf ikke har sykler, er historien konfliktserialiserbar
- H1: r2(A); r1(B); w2(A); r3(A); w1(B); w3(A); r2(B); w2(B);
- H2: r2(A); r1(B); w2(A); r2(B); r3(A); w1(B); w3(A); w2(B);
Serialiserbarhet ved lÄsing (21.1.1)
- Bruker lÄser av dataelement (poster eller blokker) for Ä garantere konfliktserialiserbarhet
- LÄsetyper
- Read_lock (X) (delt lÄs)
- Write_lock (X) (eksklusiv lÄs)
- Flere transaksjoner kan ha read_lock (delt lÄs) pÄ samme dataelement samtidig.
- Det er ogsÄ mulig med oppgradering og nedgradering av lÄser.
- Read_lock -> Write_lock
- Write_lock -> Read_lock
Implementasjon av lÄser (21.1.1)
- LÄsetabell i minne
- PostlÄser
- BlokklÄser
- TabellÄser
- VerdiomrÄdelÄser (unngÄ fantomer)
- PredikatlÄser (unngÄ fantomer)
- Eksempel:
- w2
(B); r1 (A); r2 (A); r1 (B); r3 (B); 34 LÄseimplementasjon
- w2
(B); r1 (A); r2 (A); r1 (B); r3 (B); 35 2PL - tofaselÄsing (two-phase locking)
- En transaksjon har tofaselÄsing hvis alle lÄseoperasjoner
skjer fÞr alle opplÄsingsoperasjoner T1 T2 Write_lock(X) Write_lock(X) Read(X) wait X = X + 1000 wait Write(X) wait Commit / Unlock(X) Read(X) X = X - 100 Write(X) Commit / Unlock(X) 36 2PL og «incorrect summary» T1 T2 Write_lock(X) Sum = 0 Read(X) Read_lock(X) X = X - 100 Wait Write(X) Wait Write_lock(Y) Wait Read(Y) Wait Y = Y + 100 Wait Write(Y) Wait Commit / Unlock (X, Y) Wait Read(X) Sum = Sum + X Read_lock(Y) Read(Y) Sum = Sum + Y Commit / Unlock (X,Y) 37 2PL impliserer serialiserbarhet 38 2PL-modeller
- TofaselÄsing impliserer serialiserbarhet
- Basic 2PL: «Symmetrisk fjell»
- Konservativ 2PL: LÄser alt man trenger aller fÞrst
- Strict 2PL: OpplÄsing av skrivelÄser etter commit/abort
- Rigorous 2PL: OpplÄsing etter commit/abort
39 VranglÄs (21.1.3)
- To eller flere transaksjoner venter gjensidig pÄ
hverandres lÄser
- Kan lĂžses ved forskjellige metoder
- UnngÄelse
- Oppdagelse
- Timeout
T1 T2 Read_lock(X) Read_lock(Y) Write_lock(Y) Write_lock(X) 40 VranglÄsoppdagelse (21.1.3)
- Den vanligste lĂžsningen
- Konstruer wait-for-grafen:
- Hver transaksjon er en node
- Hvis Ti venter pÄ en lÄs holdt av Tj
, fÄr vi en rettet kant Ti -> Tj
- Vi har vranglÄs hvis grafen har sykler
- PrĂžv Ă„ abortere en transaksjon og se om sykelen
forsvinner 41 Timeout (21.1.3)
- Den enkleste lĂžsningen
- La hver transaksjon ha en timeout.
- Hvis timeouten gÄr, aborter transaksjonen
- Vanskelig Ă„ sette timeouten riktig
42 Rigorous 2PL eksempel
- H1
: r1 (A); w2 (A); w2 (B); w3 (B); w1 (B); C1 ; C2 ; C3 ;
- H2
: r1 (A); w2 (B); w2 (A); w3 (B); w1 (B); C1 ; C2 ; C3 ;
- For lÄsing: Hvis en transaksjon blir blokkert, blir alle operasjoner i
transaksjonen satt pÄ vent, mens de neste operasjonene i historien blir utfÞrt i sekvens. 43 Multiversjons-CC (21.3)
- CC = Concurrency Control
- Brukes mye i dagens SQL-databaser
- La en leseoperasjon som er i konflikt, lese en gammel
versjon.
- Basert pÄ tidsstempelordning (timestamp ordering):
- Hver transaksjon har et tidsstempel TS(T)
- Hvert dataelement kan finnes i flere versjoner
(X1 ,X2 , âŠ., Xk )
- For hver versjon Xi
lagres
- read_TS(Xi
): StĂžrste tidsstempel for en trans som har lest den
- write_TS(Xi
): Tidsstempel for transaksjon som skrev Xi .
- NÄr en transaksjon skriver Xi
, settes begge til TS(T) 44 Multiversjons-CC (2)
- Regler for Ă„ sikre serialiserbarhet
- T Ăžnsker Ă„ utfĂžre write(X)
- Hvis write_TS(Xi
) <= TS(T) AND read_TS(Xi ) > TS(T)
- Rull tilbake T
- Ellers
- Lag ny versjon Xi med read_TS(Xi
) = write_TS(Xi ) = TS(T) 2. T Ăžnsker Ă„ utfĂžre read(X)
- Finn i som har hĂžyest write_TS(Xi
) <= TS(T)
- read_TS(Xi
) = Max(TS(T), read_TS(Xi ))
- Returner Xi
- Sikrer alltid suksess ved lesing
- Ulempe: Administrasjon av mange versjoner, mer plass, ikke
update-in-place? 45 Multiversjons-CC (3)
- To mÄter i praksis
- Lagrer flere versjoner av poster i databasen og kjĂžrer GC
(sÞppeltÞmming) nÄr de gamle versjonene ikke trenges lengre: Microsoft SQL, PostgresSQL, MySQL InnoDB (consistent reads).
- Lagrer kun siste versjon av posten, men kan konstruere den
forrige versjonen vha. undo: Oracle
- Noen systemer bruker bÄde lÄsing og multiversjons-CC,
«Multiversion 2PL»
- Read/write-transaksjoner bruker lÄser og 2PL
- Read-transaksjoner bruker multiversjons-CC
46 Recovery (kap. 22)
- Databasesystemet stĂžtter sikker, atomisk aksess til store
mengder data
- Transaksjonene er
- A - atomiske: Enten har de kjĂžrt helt, eller overhodet ikke
- C
- I
- D - durability: Er permanente. Etter commit mistes ikke data.
47 Transaksjoner etter krasjrecovery
- Vinnere: T1, T2 og T3 skal vĂŠre permanente.
- Tapere: T4 og T5. MĂ„ aborteres. Hvorfor?
48 Force/steal-klassifisering av Logging & Recovery-algoritmer
- Utgangspunkt: Hvor fleksibel (uavhengig) er buffer
manager til logging/recovery
- NÄr kan skitne (dirty) blokker skrives?
- NÄr mÄ skitne blokker skrives?
- Force: MĂ„ en skitten (oppdatert) blokk tvinges til disk
ved commit.
- Tregt: datablokkene kan vĂŠre spredd over hele disken
- Steal: Kan en transaksjon stjele plassen i bufferet til en
skitten blokk?
- Hvis ikke, mÄ en aktiv transaksjon ha alle skitne blokker i buffer
inntil commit. 49 Force/Steal (2) No steal Steal Force Shadowing (ikke logging) kap. 22.4 Undo-logging No-redo, kap. 22.3 No-force Redo-logging No-undo, kap. 22.2 Undo/redo-logging Aries, kap.- 22.5 50 Write-ahead logging (WAL) (22.1.3)
- Basis for undo/redo-logging
- Hver endring (insert/delete/update) har en loggpost i
loggen.
- Regler:
- Skriv en loggpost som endret en datablokk til disk fĂžr du skriver
datablokken (for undoformÄl)
- Skriv loggen til disk fÞr en transaksjon committer (for redoformÄl)
«Force log at commit» 51 WAL-konsepter i ARIES (22.5)
- LSN - loggsekvensnummer. ID for loggpost. Stigende nr.
- PageLSN - LSN til loggpost som sist endret en blokk
- FlushedLSN - LSN til nyeste skrevne loggpost til disk
- Ved skriving av datablokk til disk, sjekk
PageLSN < FlushedLSN
- Hvis ikke, skriv (flush) logg fĂžrst.
52 LSN-begreper (log sequence number) 53 Loggpost i ARIES
- PrevLSN: Peker til forrige loggpost i samme transaksjon.
For abortering av transaksjon.
- OpType: Update/insert/delete
- PageId: Hvilken blokk ble endret (BlokkId)
- Offset: Hvor i blokken ble det endret?
- BeforeImage: Verdi fĂžr endring
- AfterImage: Verdi etter endring
LSN TransID PrevLSN OpType PageId Offset BeforeImage AfterImage 54 Datastruktur for recovery (ARIES, 22.5)
- Transaksjonstabell
- Et element per aktiv transaksjon
- TransId
- Tilstand: aktiv, committed, aborting, aborted
- LastLSN: Peker til nyeste loggpost i transaksjonen
- Dirty page table (DPT)
- Et element per skitten (dirty) blokk i buffer
- PageID
- RecLSN: Peker til eldste loggpost som gjorde blokken skitten
55 Sjekkpunkting (22.5)
- Periodisk lager DBMSet et sjekkpunkt i loggen som skal
minimalisere tiden det tar Ă„ gjĂžre recovery
- Du slipper Ă„ skanne hele loggen ved recovery
- Begin checkpoint
- Lag start sjekkpunkt-loggpost
- End checkpoint
- Lag slutte sjekkpunkt-loggpost som inneholder
- Transtabell
- DPT - dirty page table
- Lagre LSN til sjekkpunktloggpost pÄ sikkert sted. Logganker
- I noen systemer er sjekkpunkting koblet til det Ă„ skrive
skitne blokker til disk (ikke ARIES) 56 Abortering av transaksjon (22.5)
- Finn LastLSN fra transaksjonstabellen
- For hver loggpost i transaksjonen (bakover)
- Lag CLR - kompenserende loggpost, som gjĂžr det motsatte av
loggposten (non-CLR)
- GjĂžr REDO av CLRen
- Fjern transaksjonen fra transaksjonstabellen
- CLRen er grunnlag for lÄser pÄ radnivÄ
(mer presise enn lÄser pÄ blokker) 57 Recovery etter krasj (22.5)
- MÄl:
- SĂžrge for at vinnertransaksjoner er permanente.
De som har committed fĂžr krasj.
- SĂžrge for at tapertransaksjoner blir borte (aborted).
De som ikke committed fĂžr krasj.
- Faser:
- Analyse: Finn vinnere og tapere. Rekonstruer DPT/TransTab
- REDO: Redo alle loggposter
- UNDO: Undo effekten av alle tapertransaksjoner
58 3 faser i Recovery 59 Recovery - eksempel Feil i lĂŠreboka: C=1 i DPT etter analysen 60 REDO av loggpost (ARIES, 22.5)
- Loggposten trenger ikke REDO hvis
- Den tilhĂžrende blokken ikke er i dirty page table (DPT)
- Blokken er i DPT, men recLSN for blokken er stĂžrre enn
loggpostens LSN 3. Blokkens pageLSN er stÞrre eller lik loggpostens LSN. Her mÄ blokken leses inn.
- Ellers redo loggpost:
- Sett inn / skriv after image inn i blokken.
- Oppdater blokkens pageLSN til loggpostens LSN
61 Andre recoveryteknikker (22.2/22.3/22.4)
- Undo/no-redo: Som ARIES, men kun undo-logging
- No-undo/redo: Som ARIES, men kun redo-logging
- Shadowing: bruker ikke logging, men lager kopier av
data ved oppdatering. Committer transaksjonen ved Ă„ kopiere inn pekere til nye data. MĂ„ ha katalog med pekere til data.
- Skiller mellom update-in-place og shadowing.