Transaktioiden eristyvyys H. Berenson, P. Bernstein, J. Gray, J. Melton, E. O Neil & P. O Neil: A critique of ANSI SQL isolation levels. Proc. of the 1995 ACM SIG- MOD Internat. Conf. on Management of Data, 1 10, kohdat 1 (introduction), 2 (isolation definitions) ja 3 (analyzing ANSI SQL isolation levels). A. Silberschatz, H. F. Korth & S. Sudarshan: Database System Concepts. Fifth Edition. McGraw-Hill, 2006, sivut 617 624, luvun 15 (transactions) kohta 15.4 (concurrent executions) ja kohdan 15.5 (serializability) alakohta 15.5.1 (conflict serializability); sivut 626 630, kohdat 15.6 (recoverability) ja 15.8 (testing for serializability). 177
Transaktioiden ajoitukset, s. 179. Transaktioiden eristyvyyden takaaminen, s. 185. Sitoutumaton päivitys, s. 187. Eristyvyysanomaliat, s. 190. Eristyvyysanomaliat ja tietokannan eheysrajoitteet, s. 193. SQL:n eristyvyystasot, s. 198. Eristyvyys ja peruuntuvuus, s. 201. Sarjallistuvuus, s. 208. 178
Transaktioiden ajoitukset Tietokantajärjestelmän keskeisiä periaatteita on tietokannan tietojen samanaikainen yhteiskäyttö. Useat transaktiot voivat hallitusti yhtäaikaa tai vuorotellen operoida tietokannan tietoalkioihin. Hienorakeisessa transaktioiden hallinnassa transaktio T 2 yleensä voi lukea tai päivittää sivulla p sijaitsevaa tietoalkiota y, vaikka toinen, vielä aktiivinen transaktio T 1 olisi lukenut tai päivittänyt samalla sivulla p sijaitsevan toisen tietoalkion x. Tämän mahdollistaa aiemmin selostettu salpauskäytäntö, jonka mukaisesti sivu pidetään salvattuna ainoastaan luku- tai päivitysoperaation keston ajan. Transaktion T 2 tulisi ilman muuta voida lukea tietoalkio x, jonka toinen, vielä aktiivinen transaktio T 1 on lukenut, mikäli kumpikaan ei päivitä x:ää. Transaktioiden operaatioiden samanaikainen (limittäinen) suoritus ei saa rikkoa tietokannan eheyttä eikä estää tietokannan elvytystä häiriöstä. Vain tietyt transaktioiden operaatioiden keskinäiset limittäiset suoritusjärjestykset voidaan sallia. 179
Määritellään yleisesti transaktiojoukon mielivaltainen ajoitus eli transaktioiden operaatioiden limittäinen suoritusjärjestys. Transaktiomalliemme mukainen transaktio voi sisältää tietokantaoperaatioidensa (R, I, D, W, I 1, D 1, W 1 ) argumentteina vakioita ja muuttujia ja näistä muodostettuja lausekkeita. Muuttujia voi esiintyä operaatioiden tulosparametrien paikalla. Syöteparametrinkin paikalla voi esiintyä muuttuja tai muuttujia sisältävä lauseke, jos muuttuja on sidottu, ts. se esiintyy jossakin edeltävässä lukuoperaatiossa tulosparametrin paikalla niin, että transaktion suorituksessa kaikille muuttujille määräytyy arvo. Transaktiossa BR[x, x,u]w[x,u,u t]r[y, y,v]w[y,v,v +t]c x:n, y:n ja t:n täytyy olla vakioita, mutta u ja v voivat olla joko vakioita tai muuttujia. Sama muuttuja tarkoittaa samaa arvoa kaikkialla saman transaktion sisällä. Eri transaktioiden muuttujat ovat eri muuttujia (vaikka olisivat saman nimisiä). Transaktio on muuttujaton, jos siinä ei esiinny muuttujia. 180
Olkoon T transaktio ja v 1,...,v n kaikki sen eri muuttujat. T :n sijoitus σ on joukko {(v 1,a 1 ),...,(v n,a n )}, missä a 1, a 2,..., a n ovat vakioita. T σ on se muuttujaton transaktio, joka saadaan T :stä korvaamalla jokainen muuttujan v i esiintymä vakiolla a i, i = 1,...,n. T σ kuvaa T :n suoritusta jokaisessa sellaisessa tietokannassa D, jossa T σ voidaan ajaa. Esim. transaktion T = BR[x,u]W[x,u,u t]r[y,v]w[y,v,v +t]c sijoituksella σ = {(u, 500),(v, 600)} saadaan T σ = BR[x,500]W[x,500,500 t]r[y,600]w[y,600,600 +t]c. T σ voidaan ajaa jokaisessa tietokannassa, joka sisältää monikot (x,500) ja (y,600). 181
Olkoot T 1,...,T n transaktioita. Joukossa voi olla eteneviä, sitoutuneita, peruuntuvia ja peruutuksensa päättäneitä transaktioita, ja transaktiot voivat sisältää osittaisperuutuksia. Transaktiojoukon {T 1,...,T n } ajoitus (schedule) eli historia (history) H on muuttujattomien transaktioiden T 1 σ 1,..., T n σ n limite (shuffle), missä σ i on T i :n jokin sijoitus, i = 1,...,n. Ts. H on seuraavat ehdot täyttävä operaatiojono: (1) H on operaatiojonon T 1 σ 1...T n σ n permutaatio, so. sisältää täsmälleen transaktioiden T 1 σ 1,...,T n σ n operaatiot, mutta mahdollisesti eri järjestyksessä. (2) Jokaisen transaktion T i σ i operaatiot esiintyvät H:ssa samassa järjestyksessä kuin T i σ i :ssä. 182
Sarjallinen ajoitus (serial schedule) H on transaktioiden permutaatio. Siinä kunkin transaktion T i σ i operaatiot esiintyvät kaikki välittömästi peräkkäin, ts. H on muotoa T i1 σ i1...t in σ in, missä {i 1,...,i n } = {1,...,n}. Ajoitus, joka ei ole sarjallinen, on epäsarjallinen eli rinnakkainen ajoitus (nonserial schedule). Esimerkki kolmen transaktion rinnakkaisesta ajoituksesta: T 1 : T 2 : T 3 : BR[1, 1] BR[2, 2] W[1,0]C BR[3, 3] W[2,0] W[3,0]C C Eräs samojen transaktioiden sarjallinen ajoitus: T 1 : BR[1, 1]W[1,0]C T 2 : T 3 : BR[3, 3]W[3,0]C BR[2, 2]W[2,0]C 183
Transaktiojoukon {T 1,...,T n } ajoituksessa H transaktion T i operaatiota o[ x] merkitään o i [ x]. Esimerkiksi em. ajoituksia merkitään: B 1 R 1 [1, 1]B 2 R 2 [2, 2]W 1 [1,0]C 1 B 3 R 3 [3, 3]W 2 [2,0]W 3 [3,0]C 3 C 2. B 3 R 3 [3, 3]W 3 [3,0]C 3 B 1 R 1 [1, 1]W 1 [1,0]C 1 B 2 R 2 [2, 2]W 2 [2,0]C 2. Merkintä (o i o i)[ x] tarkoittaa operaatiota o i [ x] tai operaatiota o i[ x]. Sanomme: T i :n operaatio R[x, z] lukee avainvälin [z,x]. T i :n operaatio R[x,>z] lukee avainvälin (z,x]. T i :n operaatio (I D W I 1 D 1 W 1 )[x] päivittää avainarvoa x. Luku-kirjoitusmallin lukuoperaatio R[x] tarkoittaa samaa kuin avainvälimallin operaatio R[x, x]; operaatio siis lukee avainvälin [x,x]. 184
Transaktioiden eristyvyyden takaaminen Kuten aiemmin on jo todettu, transaktiot tulee voida ohjelmoida ottamatta huomioon muita samanaikaisia transaktioita. Tietokantasovelluksen ohjelmoijalta edellytetään ainoastaan, että kukin transaktio säilyttää loogisen tietokannan eheyden, kun transaktio suoritetaan yksinään häiriöttömässä tilassa. Tietokannan hallintajärjestelmän samanaikaisuuden hallinnan (concurrency control) pitää huolehtia siitä, että järjestelmään tulevien transaktioiden operaatiot suoritetaan sellaisen ajoituksen mukaisesti, että (sitoutuneiden) transaktioiden eristyvyys säilyy (halutulla tasolla). Transaktion T täydellinen eristyvyys (isolation) tarkoittaa: Vaikka useampia transaktioita on suorituksessa samanaikaisesti, transaktiosta T näyttää, että jokainen toinen transaktio T joko on suoritettu kokonaisuudessaan ennen T :tä tai suoritetaan kokonaisuudessaan vasta T :n jälkeen. Jokainen sarjallinen ajoitus, jossa kaikki transaktiot ovat sitoutuneita tai peruuntuneita, takaa triviaalisti kaikille transaktioille täyden eristyvyyden. Sitä vastoin eristyvyys voi rikkoutua eri tavoin, jos ajoitus on rinnakkainen tai siinä on sitoutumattomia transaktioita. 185
Samanaikaisuuden hallintamenetelmät voidaan luokitella pessimistisiin ja optimistisiin. Pessimistisessä samanaikaisuuden hallinnassa millekään transaktiolle ei sallita eristyvyysrikkomusta (eli ns. eristyvyysanomaliaa), joka on kielletty transaktiolle asetetulla eristyvyystasolla. Mikäli transaktion operaation suoritus johtaisi kiellettyyn eristyvyysrikkomukseen, operaation suorittamista lykätään laittamalla transaktio odottamaan hetkeä, jolloin operaation suoritus ei enää johda rikkomukseen, tai sitten transaktio keskeytetään ja peruutetaan välittömästi. Optimistisessa samanaikaisuuden hallinnassa etenevän transaktion sallitaan syyllistyvän eristyvyysrikkomuksiin, mutta transaktion sitoutumispisteessä tarkistetaan, onko rikkomuksia sattunut, ja jos on, niin transaktion ei sallitakaan sitoutua, vaan se keskeytetään ja peruutetaan. 186
Sitoutumaton päivitys Tietoalkio x on likainen (dirty) eli sitoutumaton (uncommitted) tietyllä hetkellä, jos sitä viimeksi päivittänyt transaktio T on vielä aktiivinen ja on mahdollista, että T vielä muuttaa x:n arvoa. Määritellään käsite täsmällisesti suhteessa transaktiomalleihimme. Avainarvolla x on ajoituksen H aktiivisen transaktion T likainen eli sitoutumaton päivitys (dirty update, uncommitted update), jos jompikumpi seuraavista ehdoista pätee: (1) x:n viimeinen päivitys H:ssa on T :n etenemisoperaatio I[x], D[x] tai W[x]. (2) x:n viimeinen päivitys H:ssa on T :n käänteisoperaatio I 1 [x], D 1 [x] tai W 1 [x], jota vastaavan T :n etenemisoperaation I[x], D[x] tai W[x] edellä H:ssa on x:llä vielä peruuttamaton päivitys T :n etenemisoperaatiolla. Ts. x:n päivitys H:ssa T :n käänteisoperaatiolla I 1 [x], D 1 [x] tai W 1 [x] ei vielä palauta x:lle sitä arvoa, joka x:llä oli juuri ennen kuin T sitä ensi kerran päivitti. Heti kun T :n kaikki x:n päivitykset on peruutettu, x:ää pidetään sitoutuneena. 187
Tarkastellaan peruuntuneen transaktion T 1 ajoitusta H = B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]a 1 I 1 1 [x,v]d 1 1 [x,u]i 1 1 [y,w]c 1. Avainarvolla y on T 1 :n sitoutumaton päivitys H:n alkuosassa B 1 I 1 [y,w]. Avainarvoilla y ja x on T 1 :n sitoutumaton päivitys seuraavissa H:n alkuosissa: B 1 I 1 [y,w]d 1 [x,u]. B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]. B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]a 1. B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]a 1 I 1 1 [x,v]. Avainarvolla y on T 1 :n sitoutumaton päivitys H:n alkuosassa B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]a 1 I1 1 [x,v]d 1 1 [x,u]. Sitä vastoin x on tässä jo sitoutunut, sillä x:n viimeinen päivitys on käänteisoperaatio D 1 1 [x,u], jota vastaava etenemisoperaatio D 1[x,u] on x:n ensimmäinen päivitys T 1 :ssä. H:n alkuosassa H = B 1 I 1 [y,w]d 1 [x,u]i 1 [x,v]a 1 I 1 1 [x,v]d 1 1 [x,u]i 1 1 [y,w] ovat y ja x molemmat sitoutuneita. 188
Määritelmän mukaan etenevän transaktion T 1 osittaisperuutus voi muuttaa likaisen avainarvon x sitoutuneeksi, minkä jälkeen transaktio voi uudestaan päivittää x:ää ja siis muuttaa x:n likaiseksi, minkä jälkeen uusi osittaisperuutus voi jälleen muuttaa x:n sitoutuneeksi. B 1 S 1 [P]W 1 [x]. B 1 S 1 [P]W 1 [x]a 1 [P]W1 1 [x]. B 1 S 1 [P]W 1 [x]a 1 [P]W1 1 [x]c 1 [P]S 1 [Q]W 1 [x]. B 1 S 1 [P]W 1 [x]a 1 [P]W1 1 [x]c 1 [P]S 1 [Q]W 1 [x]a 1 [Q]W1 1 [x]. B 1 S 1 [P]W 1 [x]a 1 [P]W1 1 [x]c 1 [P]S 1 [Q]W 1 [x]a 1 [Q]W1 1 [x]c 1 [Q]W 1 [x]. B 1 S 1 [P]W 1 [x]a 1 [P]W1 1 [x]c 1 [P]S 1 [Q]W 1 [x]a 1 [Q]W1 1 [x]c 1 [Q]W 1 [x]c 1. 189
Eristyvyysanomaliat Rinnakkaisessa ajoituksessa transaktioiden eristyvyys voi rikkoutua kolmen eristyvyysanomalian (isolation anomaly) vaikutuksesta. Näitä voidaan transaktiomallia tarkemmin kiinnittämättä luonnehtia seuraavasti: (1) Transaktio T 2 kirjoittaa likaisesti (does a dirty write): T 2 päivittää ehdon C täyttävät tietoalkiot, kun jossakin ehdon C täyttävässä tietoalkiossa on transaktion T 1 sitoutumaton päivitys. (2) Transaktio T 2 lukee likaisesti (does a dirty read): T 2 lukee ehdon C täyttävät tietoalkiot, kun jossakin ehdon C täyttävässä tietoalkiossa on transaktion T 1 sitoutumaton päivitys. (3) Transaktio T 1 lukee toistokelvottomasti (does an unrepeatable read): T 1 lukee ehdon C täyttävät tietoalkiot, minkä jälkeen toinen transaktio T 2 päivittää jonkin ehdon C täyttävän tietoalkion T 1 :n ollessa vielä etenevä. T 1 :n lukuoperaatio on toistokelvoton, sillä sen toisto T 2 :n sitoutumisen jälkeen saattaa antaa toisen tuloksen. 190
Avainvälimallissa eristyvyysanomaliat ilmenevät seuraavasti: (1) Kirjoitetaan likainen eli sitoutumaton avainarvo. Esim. T 2 :n likainen kirjoitus I 2 [x] ajoituksessa B 1 D 1 [x]b 2 I 2 [x]... (2) Luetaan likainen avainväli. Esim. T 2 :n likainen luku R 2 [3,> 1] ajoituksessa B 1 D 1 [2]B 2 R 2 [3,>1]... (3) Luetaan avainväli toistokelvottomasti. Esim. T 1 :n toistokelvoton luku R 1 [3,>1] ajoituksessa B 1 R 1 [3,>1]B 2 I 2 [2]... Lukuoperaatiota R 1 [3,> 1] ei voida toistaa T 1 :ssä T 2 :n sitoutumisen jälkeen, vaan R 1 [x,>1] toteutuisi muodossa R 1 [2,>1]. 191
Avainvälimallin eristyvyysanomaliat täsmällisesti määriteltyinä: (1) Transaktion T 2 avainarvon x päivitysoperaatio o 2 [x] on likainen kirjoitus (dirty write) ajoituksessa H 1 o 2 [x]h 2, jos x:llä on toisen transaktion T 1 sitoutumaton päivitys H 1 :ssä. (2) Transaktion T 2 lukuoperaatio R 2 [x,θz] on likainen luku (dirty read) ajoituksessa H 1 R 2 [x,θz]h 2, jos jollakin ehdon x y θ z täyttävällä avainarvolla y on toisen transaktion T 1 :n sitoutumaton päivitys H 1 :ssä. (3) Transaktion T 1 lukuoperaatio R 1 [x,θz] on toistokelvoton luku (unrepeatable read) ajoituksessa H 1 R 1 [x,θz]h 2 o 2 [y]h 3, jos T 1 on etenevä H 1 R 1 [x,θz]h 2 :ssa ja o 2 [y] on toisen transaktion T 2 ehdon x y θ z täyttävän avainarvon y päivitysoperaatio. Huomaa, ettei lukuoperaatiota R 1 [x,θz] pidetä toistokelvottomana siinä tapauksessa, että T 1 on peruuntuva H 1 R 1 [x,θz]h 2 :ssa, sillä T 1 lopulta peruuttaa kaikki päivityksensä, mukaan lukien ne, jotka mahdollisesti perustuvat luettuun avainarvoon. Transaktion peruutusvaiheessahan ei myöskään voi esiintyä lukuoperaatioita. 192
Eristyvyysanomaliat ja tietokannan eheysrajoitteet Seuraava esimerkki osoittaa, että likainen kirjoitus voi helposti rikkoa tietokannan eheyden. Tietokannan eheysrajoite lausuu, että tietokannassa pitää olla avainarvoilla x ja y varustetut monikot ja niillä aina sama arvo. Transaktiot T 1 = BW[x,u,1]W[y,v,1]C ja T 2 = BW[x,u,2]W[y,v,2]C ovat kumpikin eheysrajoitteen suhteen oikeellisia: kumpikin transaktio yksinään suoritettuna vie tietokannan eheästä tilasta eheään tilaan. Transaktioiden rinnakkainen ajoitus B 1 W 1 [x,0,1]b 2 W 2 [x,1,2]w 2 [y,0,2]c 2 W 1 [y,2,1]c 1 voidaan ajaa jokaisessa monikot (x, 0) ja (y, 0) sisältävässä tietokannassa ja tuottaa tietokannan, jossa avainarvoin x ja y varustetut monikot ovat (x,2) ja (y,1). Ajoitus siis rikkoo tietokannan eheyden. W 2 [x,1,2] on likainen kirjoitus. Tämä on ajoituksen ainoa eristyvyysanomalia. 193
Seuraava esimerkki osoittaa, kuinka likainen luku voi rikkoa tietokannan eheyden. Tietokannan eheysrajoite lausuu, että tietokannassa pitää olla avainarvoilla x ja y varustetut monikot ja niillä aina positiiviset arvot. Transaktiot T 1 = BW[x,u,0]W[x,0,1]C ja T 2 = BR[x,u]W[y,v,u]C ovat kumpikin eheysrajoitteen suhteen oikeellisia. Transaktioiden ajoitus B 1 W 1 [x,1,0]b 2 R 2 [x,0]w 2 [y,1,0]c 2 W 1 [x,0,1]c 1 voidaan ajaa jokaisessa monikot (x, 1) ja (y, 1) sisältävässä tietokannassa ja tuottaa tietokannan, jossa avainarvoin x ja y varustetut monikot ovat (x,1) ja (y,0). Ajoitus siis rikkoo tietokannan eheyden. Ajoituksen ainoa eristyvyysanomalia on likainen luku R 2 [x,0]. T 2 luki arvon, joka ei vielä ollut lopullinen, sitoutunut arvo, ja käytti sitä tietokannan päivittämiseen. 194
Toinen esimerkki. Sama eheysrajoite: avainarvoilla x ja y varustetuilla monikoilla positiiviset arvot. T 2 kuten edellä: T 2 = BR[x,u]W[y,v,u]C. Transaktio T 3 = BW[x,u,0]AW 1 [x,u,0]c on peruuntunut ja siis triviaalisti oikeellinen minkä tahansa eheysrajoitteen suhteen. Transaktioiden T 2 ja T 3 ajoitus B 3 W 3 [x,1,0]b 2 R 2 [x,0]w 2 [y,1,0]c 2 A 3 W 1 3 [x,1,0]c 3 kuitenkin rikkoo tietokannan eheyden. Ajoituksen ainoa eristyvyysanomalia on likainen luku R 2 [x,0]. Tässäkin T 2 luki arvon, joka ei jäänytkään lopulliseksi, ja käytti sitä tietokannan päivittämiseen. 195
Seuraava esimerkki osoittaa, kuinka toistokelvoton luku voi rikkoa tietokannan eheyden. Tietokannan eheysrajoite lausuu, että avainarvoilla x ja y varustetuissa monikoissa (x,u) ja (y,v) pitää olla u + v 0 ( tilien x ja y saldojen summa ei saa olla negatiivinen ). Transaktiot T 1 = BR[y,v]W[x,u, v]c ( saldojen summan u + v otto tililtä x ), T 2 = BR[x,u]W[y,v, u]c ( saldojen summan u + v otto tililtä y ) nollaavat summan u + v ja ovat siis kumpikin eheysrajoitteen suhteen oikeellisia. Ajoitus B 1 R 1 [y,v]b 2 R 2 [x,u]w 2 [y,v, u]c 2 W 1 [x,u, v]c 1 kuitenkin rikkoo eheysrajoitteen, kun u + v > 0. Ajoituksen ainoa eristyvyysanomalia on toistokelvoton luku R 1 [y,v]. Transaktion T 1 olisi pitänyt ennen x:n päivitystä lukea y:n tuore arvo, jotta tietokanta olisi pysynyt eheänä. Operaation R 1 [y,v] toisto T 1 :ssä T 2 :n sitouduttua olisikin toteutunut muodossa R 1 [y, u], jolloin W 1 [x,u, v] olisi toteutunut muodossa W 1 [x,u,u]. 196
Toinen esimerkki. Tietokannan eheysrajoite lausuu, että avainarvolla 0 varustetun monikon arvon pitää olla kahden peräkkäisillä avainarvoilla varustettujen monikoiden arvojen summa. Eheysrajoite on voimassa esim. tietokannassa D = {(0, 4),(1, 1),(3, 3)}. Transaktiot T 1 = BR[x, 1,u]R[y,>x,v]W[0,w,u + v]c ja T 2 = BI[2,2]R[x,>2,u]W[0,w,2 + u]c ovat kumpikin eheysrajoitteen suhteen oikeellisia. Ajoitus B 1 R 1 [1, 1,1]R 1 [3,>1,3]B 2 I 2 [2,2]R 2 [3,>2,3]W 2 [0,4,5]C 2 W 1 [0,5,4]C 1 voidaan ajaa D:ssä ja tuottaa tietokannan D = {(0,4),(1,1),(2,2),(3,3)}, joka ei täytä eheysrajoitetta. Ajoituksen ainoa eristyvyysanomalia on toistokelvoton luku R 1 [3,> 1,3]. T 2 :n lisäämää monikkoa (2,2) kutsutaan haamumonikoksi (phantom tuple) tai lyhyesti haamuksi. Kirjallisuudessa tällaista toistokelvottoman luvun erikoistapausta kutsutaan yleisesti haamuilmiöksi (phantom phenomenon). 197
SQL:n eristyvyystasot SQL-kielessä on set transaction -lause, jolla sovellusohjelmassa voidaan mm. asettaa seuraavaksi käynnistettävän transaktion eristyvyystaso (isolation level) eli eristyvyysaste (degree of isolation). Eristyvyysasteiden määrittelyn pohjana olevat eristyvyysanomaliat eivät täysin vastaa edellä määrittelemiämme anomalioita. SQL:n toistokelvoton luku ei näet sisällä toistokelvottomia haamulukuja. SQL:ssä määriteltyjä eristyvyysasteita on neljä (lueteltuina vaativuudeltaan nousevassa järjestyksessä): sitoutumattoman lukeminen, sitoutuneen lukeminen, toistokelpoinen luku ja sarjallistuva. Eristyvyysasteiden merkitys selostetaan seuraavassa BERENSONin ja kumppanien (1995) korjaamien määritelmien mukaisesti. 198
1 Sitoutumattoman lukeminen (read uncommitted): transaktio ei kirjoita likaista, mutta saattaa lukea likaista tai toistokelvottomasti ja kohdata haamuja. 2 Sitoutuneen lukeminen (read committed): transaktio ei kirjoita eikä lue likaista, mutta saattaa lukea toistokelvottomasti ja kohdata haamuja. 3 Toistokelpoinen luku (repeatable read): transaktio ei kirjoita likaista eikä lue likaista tai toistokelvottomasti, mutta saattaa kohdata haamuja. 4 Sarjallistuva (serializable; oletus): transaktio ei kirjoita likaista eikä lue likaista tai toistokelvottomasti eikä myöskään kohtaa haamuja. Tällä tasolla kaikki määritelmämme mukaiset likaiset kirjoitukset, likaiset luvut ja toistokelvottomat luvut on estetty. 199
DB2-järjestelmässä käytetyt eristyvyysasteiden nimitykset vastaavat paremmin tällä kurssilla esitettyjä määritelmiä kuin SQL:n eristyvyysasteet. DB2:ssa eristyvyysasteen 3 nimenä on luvun vakaus (read stability). Toistokelpoisen luvun eristyvyysaste tarkoittaa DB2:ssa SQL:n eristyvyysastetta 4. Tietokannan hallintajärjestelmät pystyvät yleensä takaamaan transaktioille vähintään asteen 3. Samanaikaisuuden lisäämiseksi voidaan joillekin transaktioille sallia normaalia heikompi eristyvyysaste. Transaktiolle voidaan taata haluttu eristyvyysaste (1 4 ), jos kaikilta muilta transaktioilta vaaditaan vähintään aste 1. 200
Eristyvyys ja peruuntuvuus Olkoon H transaktiojoukon {T 1,...,T n } ajoitus, joka voidaan ajaa tietokannassa D ja tuottaa tietokannan D. Joukossa on eteneviä, sitoutuneita, peruuntuvia ja peruutuksensa päättäneitä transaktioita. Tarkastellaan H:n etenevää transaktiota T i = Bα i. Siis H:ssa esiintyy limitettynä T i σ i, jollakin T i :n sijoituksella σ i. Nyt T i haluaakin keskeytyä. T i σ i pitää siis täydentää peruutuksensa päättäneeksi transaktioksi (Bα i Aα 1 i C)σ i. Luonnollinen vaatimus on, että peruutuksen pitää olla mahdollista H:ssa, ts. täydennetty ajoitus H(Aα 1 i C)σ i on voitava ajaa D:ssä, eli täydennysjono (Aα 1 i C)σ i on voitava ajaa D :ssa. 201
Tarkastellaan transaktioiden T 1 = BW[x,u,1] ja T 2 = BD[x,u]C ajoitusta B 1 W 1 [x,0,1]b 2 D 2 [x,1]c 2, joka voidaan ajaa monikon (x, 0) sisältävässä tietokannassa D ja tuottaa tietokannan D = D \ {(x,0)}. Nyt T 1 haluaa keskeytyä, joten B 1 W 1 [x,0,1] täydennetään transaktioksi B 1 W 1 [x,0,1]a 1 W 1 1 [x,0,1]c 1. Vastaavaa täydennettyä ajoitusta B 1 W 1 [x,0,1]b 2 D 2 [x,1]c 2 A 1 W 1 1 [x,0,1]c 1 ei kuitenkaan voida ajaa D:ssä. Operaatio D 2 [x,1] on sitoutuneen transaktion T 2 tekemä likainen kirjoitus. 202
Vastaavanlainen tilanne syntyy transaktioiden T 1 = BD[x,u] ja T 2 = BI[x,u]C sekä ajoituksen H = B 1 D 1 [x,0]b 2 I 2 [x,0]c 2 tapauksessa: täydennettyä ajoitusta HA 1 D 1 1 [x,0]c 1 = B 1 D 1 [x,0]b 2 I 2 [x,0]c 2 A 1 D 1 1 [x,0]c 1 ei voida ajaa missään tietokannassa D, jossa H voidaan ajaa. H:n sitoutuneen transaktion T 2 :n operaatio I 2 [x,0] on likainen kirjoitus. 203
Tarkastellaan vielä kahden etenevän transaktion T 1 = BW[x,u,1] ja T 2 = BW[x,u,2] ajoitusta B 1 W 1 [x,0,1]b 2 W 2 [x,1,2]. Tässä W 2 [x,1,2] on likainen kirjoitus. Nyt molemmat transaktiot haluavat keskeytyä. Peruutus onnistuu, jos käänteisoperaatiot suoritetaan tarkalleen kirjoitusten kronologisen järjestyksen käänteisjärjestyksessä: B 1 W 1 [x,0,1]b 2 W 2 [x,1,2]a 2 W 1 2 [x,1,2]c 2 A 1 W 1 1 [x,0,1]c 1 (operaatioiden A 1 ja A 2 tai C 1 ja C 2 keskinäisellä järjestyksellä ei tässä ole väliä). Sitä vastoin T 1 :n kirjoituksen peruuttaminen ensin johtaisi ajoitukseen, joka ei määritelmämme mukaan ole ajettavissa: B 1 W 1 [x,0,1]b 2 W 2 [x,1,2]a 1 W 1 1 [x,0,1]c 1 A 2 W 1 2 [x,1,2]c 2. Jos taas määrittelisimme, että W[x,u,v] on aina ajettavissa tietokannassa, joka sisältää avainarvolla x varustetun monikon (vaikka sen arvo olisikin u:sta poikkeava), tuottaisi peruutus alkuperäisestä poikkeavan tietokannan. 204
Olkoon H ajoitus, jossa yksikään sitoutunut tai peruutuksensa päättänyt transaktio ei kirjoita likaista. Voidaan näyttää: Operaatiojonot, joilla H:n aktiiviset transaktiot täydennetään peruutuksensa päättäneiksi transaktioiksi, voidaan limittää jonoksi γ niin, että täydennetty ajoitus Hγ voidaan ajaa jokaisessa tietokannassa, jossa H voidaan ajaa. Eräässä tällaisessa γ:ssa kirjoitusten käänteisoperaatiot ovat täsmälleen kirjoitusten kronologisen järjestyksen käänteisjärjestyksessä. 205
On järkevää vaatia, että normaalin transaktionkäsittelyn aikana useammat transaktiot voivat peruuntua ja että tämä voi tapahtua rinnakkaisesti satunnaisessa järjestyksessä. Likaiset kirjoitukset on siten kokonaan estettävä. Järjestelmä ei saa tuottaa yhtään ajoitusta, jossa jokin transaktio kirjoittaisi likaista. Käytännössä ei voitaisikaan rajoittua estämään ainoastaan sitoutuneitten tai peruutuksensa päättäneiden transaktioiden likaisia kirjoituksia. Kirjallisuudessa kutsutaan ankaraksi (strict) sellaista ajoitusta, jossa yksikään sitoutunut tai peruutuksensa päättänyt transaktio ei kirjoita likaista ja jossa lisäksi mikään transaktio ei lue likaista. 206
Olkoon H ajoitus, jossa yksikään transaktio ei kirjoita likaista. Olkoon γ mikä tahansa niiden operaatiojonojen limite, joilla H:n aktiiviset transaktiot täydennetään peruutuksensa päättäneiksi transaktioiksi. Voidaan näyttää: (1) Täydennetty ajoitus Hγ voidaan ajaa missä tahansa tietokannassa, jossa H voidaan ajaa. (2) Yksikään Hγ:n transaktio ei kirjoita likaista. (3) Yksikään Hγ:n transaktio ei lue likaista, ellei jokin H:n transaktio lue likaista. (4) Yksikään Hγ:n transaktio ei lue likaista eikä toistokelvottomasti, ellei jokin H:n transaktio lue likaista tai toistokelvottomasti. 207
Sarjallistuvuus Transaktiojoukon {T 1,...,T n } ajoitukset H ja H ovat yhtäpitävät eli ekvivalentit, jos jokaisella tietokannalla D, jolla toinen ajoituksista voidaan ajaa, myös toinen ajoitus voidaan ajaa ja kumpikin ajoitus tuottaa saman tietokannan H(D) = H (D). Transaktiojoukon {T 1,...,T n } ajoitusta sanotaan yleisesti sarjallistuvaksi (serializable), jos se on yhtäpitävä saman transaktiojoukon jonkin sarjallisen ajoituksen kanssa. Tarkastellaan, miten tämä yleinen sarjallistuvuuden käsite rinnastuu SQL:n sarjallistuvaan eristyvyystasoon. 208
Olkoot T 1 ja T 2 ajoituksen H kaksi eri transaktiota. Määrittelemme, että T 1 konfliktoi T 2 :n kanssa, merk. T 1 < T 2, jos jokin seuraavista ehdoista on voimassa H:ssa: (1) T 1 päivittää avainarvoa x ja sitten myös T 2 päivittää x:ää (kirjoitus-kirjoitus-konflikti, write-write conflict). (2) T 1 päivittää avainarvoa x ja sitten T 2 lukee x:n sisältävän avainvälin (kirjoitus-luku-konflikti, write-read conflict). (3) T 1 lukee avainvälin ja sitten T 2 päivittää tälle avainvälille kuuluvaa avainarvoa x (luku-kirjoitus-konflikti, read-write conflict). 209
Oletetaan, että ajoituksessa H kaikille transaktioille T 1 ja T 2 pätee seuraava ehto: Jos T 1 < T 2, niin T 2 T 1. Ts. konfliktoivuussuhde < luo H:n transaktioiden joukkoon osittaisjärjestyksen. Tätä osittaisjärjestystä kutsutaan H:n transaktioiden sarjallistuvuusjärjestykseksi (serializability order). Silloin H on yhtäpitävä jokaisen sellaisen sarjallisen ajoituksen kanssa, jossa H:n transaktiot ovat niiden sarjallistuvuusjärjestyksessä. Esimerkiksi transaktioiden T 1 = BR[x, x]r[y, y] ja T 2 = BR[x, x]i[y]c rinnakkainen ajoitus H 1 = B 1 R 1 [x, x]b 2 R 2 [x, x]i 2 [y]c 2 R 1 [y, y] on yhtäpitävä sarjallisen ajoituksen H 2 = B 2 R 2 [x, x]i 2 [y]c 2 B 1 R 1 [x, x]r 1 [y, y] kanssa, kun x y. Transaktioiden sarjallistuvuusjärjestys on T 2 < T 1. 210
Olkoon H ajoitus, jossa ei esiinny päivitysten käänteisoperaatioita I 1, D 1 ja W 1. Jos H:ssa joillekin transaktioille T 1 ja T 2 pätee T 1 < T 2 ja T 2 < T 1, niin H:ssa esiintyy vähintään yksi eristyvyysanomalia (likainen kirjoitus, likainen luku tai toistokelvoton luku) T 1 :n ja T 2 :n kesken. Tämä nähdään seuraavasti. Olkoon konfliktin T 1 < T 2 aiheuttava operaatiopari o 1, o 2. Jos tämä ei aiheuta eristyvyysanomaliaa, niin H:n täytyy olla muotoa H =...o 1...C 1...o 2... Olkoon konfliktin T 2 < T 1 aiheuttava operaatiopari o 2, o 1. Jos tämä ei aiheuta eristyvyysanomaliaa, niin H:n täytyy olla muotoa H =...o 2...C 2...o 1... Edellisessä tapauksessa T 1 sitoutuu ennen T 2 :ta ja jälkimmäisessä tapauksessa T 2 sitoutuu ennen T 1 :tä. Jommankumman konflikteista T 1 < T 2 ja T 2 < T 1 täytyy siis aiheuttaa eristyvyysanomalia. 211
Välttämätön ehto SQL:n sarjallistuvuudelle eli eristyvyysanomalioiden esiintymättömyydelle on siis, ettei ajoituksen millekään eri transaktioille ehdot T 1 < T 2 ja T 2 < T 1 ole samanaikaisesti voimassa (olettaen, ettei ajoituksessa esiinny päivitysten käänteisoperaatioita). Ehto ei kuitenkaan ole riittävä, sillä esim. ajoituksessa B 1 W 1 [x]b 2 W 2 [x] T 1 < T 2 mutta T 2 T 1, vaikka ajoituksessa esiintyy likainen kirjoitus. Oletetaan, että ajoituksen H kaikki transaktiot ovat sitoutuneita ja ettei niissä esiinny osittaisperuutuksia ja että kunkin transaktion T i sitoutumisoperaatio C i on H:ssa välittömästi T i :n viimeisen luku- tai päivitysoperaation jälkeen. Silloin H:ssa esiintyy eristyvyysanomalioita silloin ja vain silloin kun joillekin H:n transaktioille T 1 ja T 2 pätee T 1 < T 2 ja T 2 < T 1. Osittaisperuutuksia ja peruuntuneita transaktioita sisältäville ajoituksille voidaan johtaa vastaava tulos modifioimalla konfliktoivuuden määritelmää sopivasti. 212