Hajautettujen transaktioiden hallinta

Samankaltaiset tiedostot
Tietokantarakenteet ja -algoritmit 3. harjoitus

Seminaari: Keskusmuistitietokannat. Keskusmuistitietokantojen samanaikaisuuden hallinta Ilkka Pullinen

Elvytys. R & G Chapter Tietokannan hallinta, kevät 2006, J. Li 1

R 2 [0] ei ole likainen luku, sillä avaimelle 0 on jo palautettu sen alkuperäinen arvo.

Transaktioiden peruutus ja tietokannan elvytys häiriöstä

Muita transaktioiden hallintamenetelmiä

HAAGA-HELIA Heti-09 1 (14) ICT05: Tiedonhallinta ja Tietokannnat O.Virkki Transaktionkäsittely

IIO30220 Database Management / Tietokannan hallinta TAPAHTUMIEN HALLINTA JOUNI HUOTARI ( )

Tietokantarakenteet ja -algoritmit 6. harjoitus

Transaktioiden eristyvyys

HELIA 1 (14) Outi Virkki Tiedonhallinta

Samanaikaisuuden hallinta. tietokantapalvelimessa. Tiedonhallintaa. Alkuper. versio: Jaakko Rantanen Pieniä korjauksia: Jouni Huotari 26.2.

Lokin ylläpito ja puskurinhallinta

Sivupalvelin- ja yhteislevyjärjestelmät

Sovellusarkkitehtuurit

Looginen tietokanta ja transaktiot

D B. Transaktionhallinta - samanaikaisuus. Transaktionhallinta - samanaikaisuus. Transaktionhallinta - samanaikaisuus

D B. Transaktionhallinta - samanaikaisuus

5.2 Samanaikaisuuden hallinta

Transaktiot - kertausta

Helsingin yliopisto/tktl Tietokannan hallinta, kevät Harri Laine 1 D B. Transaktionhallinta - samanaikaisuus

5. Tapahtumien hallinta. Esim. pankkitilisovelluksen proseduuri tilisiirto(t1, t2, x), joka siirtää x mk tililtä t1 tilille t2:

Lisätään avainarvo 6, joka mahtuu lehtitasolle:

Samanaikaisuuden hallinta Snapshot Isolationin avulla

Helsingin yliopisto/tktl Tietokannan hallinta, kevät Harri Laine 1 D B. Transaktionhallinta. Transaktionhallinta. Transaktionhallinta

Transaktionhallinta. R & G Chapter Tietokannan hallinta, kevät 2006, J. Li 1

Web-palveluiden transaktionaalinen koostaminen

Tietokanta (database)

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

Transaktionhallinta. Transaktionhallinta. Transaktionhallinta. R & G Chapter 17

Tietohakemisto ja Transaktionkäsittely

Transaktioiden samanaikaisuuden hallinta

HELIA TIKO-05 SQL-TRANSAKTIOT 1 ( 12) ICT03D Tieto ja tiedon varastointi

T Transaktionhallinta tietokantajärjestelmissä

Tietokannan eheysrajoitteet ja niiden määrittäminen SQL-kielellä

Lisätään avainarvo 1, joka mahtuu lehtitasolle:

Tilannevedoseristyvyydessä esiintyvät eristyvyysanomaliat

D B. Transaktionhallinta

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto

Sisältö. Tosiaikajärjestelmät Luento 11: Tosiaikatietokannat. Abstrakti tietokantamalli. Tietoalkio ACID. Transaktion tilat. Abstrakti tietokantamalli

Tosiaikajärjestelmät Luento 11: Tosiaikatietokannat

Maiju Mykkänen Susanna Sällinen

CSE-A1200 Tietokannat

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

CS-A1150 Tietokannat CS-A1150 Tietokannat / 47

5.2 Samanaikaisuuden hallinta

Tiedon hajauttaminen ja hajautettu kyselynkäsittely

Tietokannan hallinta. Kevät 2004 Jan Lindström R&G Chapter 1

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

TCAP - Transaction Capabilities Sovellusosaa käyttävät

Tietokannan hallintajärjestelmän (DBMS) palvelut ja rakenne

Tapahtumanhallinnan pulmakohtia ja ratkaisuja

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Keskusmuistitietokantojen samanaikaisuuden hallinta

Tiedon varmentaminen mobiilissa ja langattomassa ympäristössä

[c] What is the difference between a modified page and a dirty page? Mitä eroa on päivitetyllä sivulla ja likaisella sivulla?

D B. Tietokannan hallinta kertaus

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

Samanaikaisuuden hallinta

Tietokantarakenteet ja -algoritmit Harjoitukset 1-12

Tapahtumanhallinnan pulmakohtia ja ratkaisuja

T Hajautetut tietokannat

Käyttöjärjestelmät: prosessit

Tapahtumanhallinnan pulmakohtia ja ratkaisuja

Tietokantakurssit / TKTL

HELIA 1 (14) Outi Virkki Tiedonhallinta

Visma Liikkuvan työn ratkaisut Päivitysohje. Pääkäyttäjän opas

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Java ja tietokannan käsittely (JDBC)

Visma Liikkuvan työn ratkaisut

Tehtävä 2: Tietoliikenneprotokolla

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

TIEDONHALLINTA - SYKSY Luento 12. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

TCAP - Transaction Capabilities Sovellusosaa käyttävät

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

TIETOKANTOJEN PERUSTEET MARKKU SUNI

2. EDUCLOUD -ALLIANSSIN TAUSTA JA TARKOITUS

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Samanaikaisuuden hallinta MySQLtietokannanhallintajärjestelmässä. Vesa Tähkävuori

Opus SMS tekstiviestipalvelu

KServer Etäohjaus Spesifikaatio asiakaspuolen toteutuksille

Hajautettujen transaktioiden käsittelyjärjestelmät

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,

Tietokantaohjelmoinnin tekniikkoja Java-kielellä

TIEDONHALLINNAN PERUSTEET - SYKSY 2013

Hajautetut tietokannat Talvi 2016 Vastaukset Laskuharj. 5. CS-E4630 Distributed Databases Winter 2016 Answers Tutorial 5 1/9

/ ta. Osaa kvalitatiivisella tasolla arvioida sovelluksen hajauttamisen hyötyjä ja haittoja.

Toisinnetun tietokannan hallinta

Helsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista

Kiertokysely. Sulautetut järjestelmät Luku 2 Sivu 1 (??)

Tietojärjestelmä tuotantoympäristössä. Sovellusohjelmat Helsingin ammattikorkeakoulu Stadia / Tekniikka ja liikenne Vesa Ollikainen

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

TIETOKANTOJEN PERUSTEET OSIO 14 MARKKU SUNI

Helsingin yliopisto/tktl Tietokantojen perusteet, s 2006 Tiedon mallinnus ja tietokannat. Harri Laine 1. Tietokanta.

HELIA 1 (16) Outi Virkki Tietokantasuunnittelu

Transkriptio:

Hajautettujen transaktioiden hallinta M. Kifer, A. Bernstein & P. M. Lewis: Database Systems. An Application-Oriented Approach. Complete Version. Pearson Addison Wesley, 2006; sivut 1005 1028, luvun 24 (implementing distributed transactions) kohdat 24.1 (implementing the ACID properties), 24.2 (atomic termination), 24.3 (transfer of coordination), 24.4 (distributed deadlock), 24.5 (global serialization) ja 24.6 (when global atomicity cannot be guaranteed); sivut 965 967, luvun 23 (architecture of transaction processing systems) kohta 23.4 (the TP monitor: global atomicity and the transaction manager). A. Silberschatz, H. F. Korth & S. Sudarshan: Database System Concepts. Sixth Edition. McGraw-Hill, 2010; sivut 830 840 ja 844 847 ja 850 852, luvun 19 (distributed databases) kohdat 19.3 (distributed transactions) ja 19.4 (commit protocols), kohdan 19.5 (concurrency control in distributed databases) alakohdat 19.5.1.1 (single lockmanager approach), 19.5.1.2 (distributed lock manager) ja 19.5.4 (deadlock handling), sekä kohdan 19.6 (availability) alakohta 19.6.5 (coordinator selection). A. Silberschatz, H. F. Korth & S. Sudarshan: Database System Concepts. Fifth Edition. McGraw-Hill, 2006; sivut 837 848 ja 852 854 ja 857 859, luvun 22 (distributed databases) kohdat 22.3 (distributed transactions) ja 22.4 (commit protocols), kohdan 22.5 (concurrency control in distributed databases) alakohdat 22.5.1.1 (single lockmanager approach), 22.5.1.2 (distributed lock manager) ja 22.5.4 (deadlock handling), sekä kohdan 22.6 (availability) alakohta 22.6.5 (coordinator selection). C. Mohan, D. Haderle, B. Lindsay, H. Pirahesh & P. Schwartz: ARIES: a transaction recovery method supporting fine-granularity locking and partial rollbacks using write-ahead logging. ACM Transactions on Database Systems 17:1 (1992), 94 162; sivut 114, kohta 4.3 61

(transaction table), ja 122 128, kohdan 6 (restart processing) alakohdat 6.1 (analysis pass), 6.2 (redo pass) ja 6.3 (undo pass). G. Samaras, K. Britton, A. Citron & C. Mohan: Two-phase commit optimizations and tradeoffs in the commercial environment. ICDE 1993, Proc. of the 9th IEEE Internat. Conf. on Data Engineering, 1993, 520 529. Hajautetun tietokannan transaktiot, s. 63. Atominen sitoutuminen, s. 71. Kaksivaiheinen sitoutumiskäytäntö, s. 75. Usean alueen ylittävä atominen sitoutuminen, s. 86. Häiriöiden käsittely kaksivaiheisessa sitoutumiskäytännössä, s. 90. Pisteen elvytys häiriöstä, s. 94. Hajautettujen transaktioiden X/Open-käsittelymalli, s. 101. Hajautettu lukkiuma, s. 104. Globaali sarjallistuvuus, s. 107. Heikommat sitoutumiskäytännöt, s. 110. 62

Hajautetun tietokannan transaktiot Hajautetun tietokantajärjestelmän jokainen piste s pystyy käsittelemään paikallisia transaktioita (local transaction), jotka operoivat ainoastaan pisteessä s säilytettäviin tietoihin. Piste voi myös osallistua globaaleihin transaktioihin (global transaction) eli hajautettuihin transaktioihin (distributed transaction), jotka operoivat useampien eri pisteiden tietoihin. Hajautettu transaktio, joka operoi pisteissä s 0,s 1,...,s n säilytettäviin tietoihin, koostuu alitransaktioista (subtransaction) T 0,T 1,...,T n, missä kukin T i on paikallinen transaktio eli operoi ainoastaan pisteen s i tietoihin. Alitransaktio T i käsittää siis hajautetun transaktion ne tietokantaoperaatiot, jotka kohdistuvat pisteen s i tietoihin. Piste s i (tai sen transaktionhallitsin), jonka suoritettavana on hajautetun transaktion jokin alitransaktio, on osallinen (cohort, participant) kyseiseen hajautettuun transaktioon. 63

Hajautettu transaktio on itse asiassa joukko paikallisia transaktioita, joiden suoritusta koordinoidaan. Transaktion koordinoijana (coordinator) on useimmissa tapauksissa transaktion aloituspisteen transaktionhallitsin. Transaktion aloittajan valitseminen transaktion koordinoijaksi ei kuitenkaan aina ole paras ratkaisu. Aloituspiste ei ehkä ole luotettavin transaktion osallisista. Transaktio saattaa olla aloitettu jonkin toiminnon seurauksena myyntipisteen päätteeltä ja siihen voi sisältyä operointia kaupan pääkonttorin ja asiakkaan pankin tietokantapalvelimiin. On turvallisempaa koordinoida transaktio näistä palvelimista käsin. Tämä edellyttää mahdollisuutta siirtää transaktion koordinointi pisteestä toiseen. Toinen syy koordinoinnin siirtoon voi olla transaktion sitoutumisen koordinoinnin aikana vaihdettavien viestien määrän optimointi. 64

Seuraavassa oletetaan, että transaktion aloituspiste on samalla koordinaatiopiste. Pisteessä s 0 käynnistetty hajautettu transaktio pilkotaan s 0 :ssa alitransaktioiksi niihin pisteisiin, joiden tietoihin transaktiossa operoidaan. Piste s 0 koordinoi näiden alitransaktioiden suoritusta. Jos pisteessä s 0 käynnistetty hajautettu transaktio T operoi pisteissä s 0,s 1,...,s n säilytettäviin tietoihin, T pilkotaan alitransaktioiksi T 0,T 1,...,T n, missä T i on pisteen s i transaktio, i = 0,1,...,n. Sovellus aloittaa transaktion suorittamalla begin transaction()- operaation, joka asettaa transaktion alkurajan (initial transaction boundary). Sovellus asettaa transaktion loppurajan (final transaction boundary) eli ilmoittaa transaktion T päättymisestä suorittamalla joko operaation commit() (sitoutuminen) tai rollback() (keskeytys ja peruutus). 65

Oletetaan, että integroidun hajautetun tietokannan relaatio employee(ssn, name, salary, title, location) on ositettu vaakasuorasti location-attribuutin mukaan pisteisiin s 0,s 1,...,s n. Pisteessä s 0 toimiva sovellus käynnistää hajautetun transaktion suorittamalla seuraavan ohjelmakoodin, jonka tarkoituksena on korottaa kaikkien työntekijöiden palkkoja 5 %:lla: begin transaction(); exec sql update employee set salary = salary 1.05; commit(). Koordinaatiopiste s 0 pilkkoo transaktion (n + 1):ksi paikalliseksi transaktioksi, joista kukin kohdistaa operaation exec sql update employee set salary = salary 1.05 paikalliseen palaseensa employee-relaatiosta. Pisteessä s i suoritettava paikallinen transaktio kirjoituslukitsee paikallisen palasensa employee-relaatiosta ja kirjaa paikalliseen lokiinsa monikoiden päivityksistä normaalit toisto- ja peruutuskelpoiset lokikirjaukset. 66

Kussakin pisteessä s i ylläpidetään normaaliin tapaan lokia (log) s i :ssä toimivien transaktioiden tai alitransaktioiden s i :n tietoihin kohdistamista päivityksistä. Transaktion T pisteessä s i suorittama etenemisvaiheen päivitysoperaatio (tietoalkion lisäys, poisto tai muutos) o[ x] kirjataan s i :n lokiin tavanomaisella fysiologisella toisto- ja peruutuskelpoisella (redo-undo) kirjauksella n: T, p,i,o[ x],m, missä n on kirjauksen lokijärjestysnumero (log sequence number, LSN), p on sen tietosivun sivutunniste (page identifier), jolle päivitys tehtiin, i on päivitetyn tietoalkion (relaation monikon) sijaintipaikka sivulla p ja m on T :n edellisen (vielä peruuttamatta olevan) etenemisvaiheen päivityksen lokikirjauksen järjestysnumero (Undo-Next-LSN). Päivitysoperaation o[ x] käänteisoperaatio eli peruutusoperaatio (undo action) o 1 [ x ] kirjataan fysiologisella toistokelpoisella (redo-only) kirjauksella n : T, p,i,o 1 [ x ],m, missä operaation argumenteista x on mukana se osa ( x ), joka tarvitaan operaation toistoon. 67

Kunkin pisteen s i transaktiotaulussa (transaction table) on s i :n jokaisesta aktiivisesta tai vasta äskettäin sitoutuneesta transaktiosta T transaktiotietue (transaction record), joka sisältää seuraavat tiedot: (1) T :n tunniste. (2) Alitransaktion T tapauksessa sen transaktion T tunniste, jonka alitransaktio T on, sekä T :n koordinoijan tunniste. (3) Pisteen s i koordinoiman hajautetun transaktion T tapauksessa T :n osallisten tunnisteiden lista L. (4) T :n viimeisen (vielä peruuttamatta olevan) päivitysoperaation lokikirjauksen järjestysnumero Undo-Next-LSN. (5) T :n tila (state), joka voi olla etenevä (forward-rolling), peruuntuva (backward-rolling), sitoutumisvalmis (prepared to commit) tai sitoutunut (committed). Sitoutumisvalmis transaktio (prepared-to-commit transaction, prepared transaction) on etenevä transaktio, joka on päässyt onnistuneesti loppuun ja on ilmoittanut koordinoijalle valmiudestaan sitoutua, mutta odottaa koordinoijan päätöstä siitä, pitääkö sitoutua vai keskeytyä. 68

ARIES-algoritmia käyttävän pisteen s i päivitettyjen sivujen taulussa (modified-pages table) on jokaisesta s i :n puskurissa olevasta sivusta p tietue, joka sisältää p:n tunnisteen ja LSN-arvon Rec-LSN(p). Arvo Rec-LSN(p) ilmoittaa (enemmän tai vähemmän konservatiivisesti), mistä LSN-arvosta lähtien lokissa voi olla sivun p päivityksiä, jotka eivät näy p:n levyversiossa. Piste s i hallitsee siellä suorituksessa olevien paikallisten transaktioiden ja hajautettujen transaktioiden alitransaktioiden samanaikaisuutta. Mikäli samanaikaisuuden hallinta perustuu lukitukseen, on s i :ssä lukkotaulu (lock table), joka sisältää s i :n transaktioiden s i :n tietoalkioihin varaamat lukot. 69

Hajautettujen transaktioiden hallintamekanismin täytyy taata hajautetun transaktion globaali atomisuus (global atomicity): Hajautetun transaktion T aliransaktioiden T 0,T 1,...,T n suorituksen koordinoinnin tulee johtaa joko kaikkien alitransaktioiden sitoutumiseen tai sitten kaikkien alitransaktioiden keskeytymiseen ja peruuntumiseen. Esim. edellisessä esimerkissä palkankorotuksen on jäätävä voimaan kaikissa pisteissä tai ei yhdessäkään pisteessä. Oletamme, että jokaisen pisteen transaktionhallitsin pystyy normaaliin tapaan takaamaan paikallisten transaktioidensa keskinäisen eristyvyyden sekä havaitsemaan (tai estämään) paikallisten transaktioiden varaamista lukoista johtuvat paikalliset lukkiumat. Hajautetun tietokannan transaktioiden hallinnassa täytyy vastaavasti pystyä takaamaan hajautettujen transaktioiden keskinäinen eristyvyys, globaali eristyvyys (global isolation), halutulla tasolla, tiukimmillaan globaali sarjallistuvuus (global serializability). Samoin täytyy pystyä havaitsemaan (tai estämään) hajautettujen transaktioiden alitransaktioiden eri pisteissä varaamista lukoista johtuvat hajautetut lukkiumat (distributed deadlock). 70

Atominen sitoutuminen Globaalin atomisuuden takaamiseksi hajautetun transaktion voidaan sallia sitoutuvan vain jos kaikki sen alitransaktiot sitoutuvat. Vaikka alitransaktio olisi onnistuneesti suorittanut kaikki sille osoitetut tietokantaoperaatiot ja olisi omasta puolestaan valmis sitoutumaan, se ei voi yksipuolisesti päättää tehdä niin, koska saman hajautetun transaktion jokin toinen alitransaktio saattaa keskeytyä tai on jo keskeytynyt. Jos hajautetun transaktion jokin alitransaktio keskeytyy, koko hajautetun transaktion pitää keskeytyä. Kun alitransaktio on päässyt onnistuneesti loppuun, sen täytyy siis odottaa saman transaktion kaikkien muidenkin alitransaktioiden onnistunutta päättymistä ennen kuin se voi sitoutua. Hajautetun transaktion koordinoija suorittaa atomisen sitoutumiskäytännön (atomic commit protocol) globaalin atomisuuden takaamiseksi. 71

Kun sovellusohjelma haluaa aloittaa pisteessä s 0 uuden transaktion, se ilmoittaa siitä pisteen transaktionhallitsimelle eli transaktion koordinoijalle suorittamalla begin transaction()-operaation. Koordinoija määrää uuden transaktiotunnisteen T, varaa transaktiolle transaktiotietueen s 0 :n transaktiotaulusta ja kirjaa lokiinsa T :n aloituskirjauksen T,B. Aina kun sovellus pyytää SQL-lauseen suorittamista jossakin pisteessä s i, pisteen s i tietokannanhallitsimelle välitetään myös transaktiotunniste T. Jos T :tä varten ei s i :ssä ole vielä alitransaktiota aktiivisena, s i :n transaktionhallitsin määrää uuden transaktiotunnisteen T i, vie transaktiotauluunsa tiedon s 0 :n koordinoiman hajautetun transaktion T alitransaktiosta T i, kirjaa lokiinsa T i :n aloituskirjauksen T i,s 0,T,B ja tiedottaa s 0 :lle liittyneensä (join) transaktioon T. Koordinoija lisää osallispisteen s i tunnisteen T :n transaktiotietueeseen. Transaktion päättyessä T :n transaktiotietue sisältää siis listan T :n kaikista osallisista. 72

Jos taas T :tä varten on s i :ssä jo alitransaktio, tämä havaitaan s i :n transaktiotaulusta, joten uutta alitransaktiota ei luoda. Transaktion T osallisessa s i suoritettavat tietokantaoperaatiot toteutetaan kaikki alitransaktion T i nimissä, so. transaktion varaamat lukot s i :n tietoalkioihin kirjataan lukkotauluun T i :n nimiin ja transaktion s i :n tietoalkioihin kohdistamat päivitykset kirjataan s i :n lokiin T i :n nimiin. Sovellus ilmoittaa koordinoijalle transaktion T onnistuneesta päättymisestä suorittamalla commit()-operaation. Koordinoija aloittaa nyt atomisen sitoutumiskäytännön suorittamisen. 73

Koordinoijan täytyy tutkia, ovatko kaikki osallispisteet valmiita sitouttamaan T :n. Osallispiste s saattaa olla kyvytön sitouttamaan T :tä seuraavista syistä: Pisteen s tietokantakaaviossa saattaa olla eheysrajoite, jonka tarkistaminen on määrätty suoritettavaksi viivästetysti (deferred) eli vasta transaktion pyytäessä sitoutumista. Kun pisteen s alitransaktio pääsee loppuun, s:n tietokannanhallitsin havaitsee eheysrajoitteen rikkoutuneen ja keskeyttää alitransaktion. Pisteessä s saatetaan käyttää optimistista samanaikaisuuden hallintakäytäntöä. Kun alitransaktio pääsee loppuun, validointiproseduurissa (konfliktien tarkistuksessa) havaitaan eristyvyysrikkomus, joten alitransaktio keskeytetään. Pisteen s alitransaktio on keskeytetty (paikallisen) lukkiuman tai (paikallisen) eristyvyysrikkomuksen vuoksi. Piste s on saattanut romahtaa ja on sen vuoksi kykenemätön vastaamaan koordinoijan lähettämiin viesteihin. Pisteiden väliset tietoliikenneyhteydet ovat saattaneet joutua epäkuntoon, niin etteivät viestit kulje koordinaatiopisteen ja pisteen s välillä. 74

Kaksivaiheinen sitoutumiskäytäntö Eniten käytetty atominen sitoutumiskäytäntö on kaksivaiheinen sitoutumiskäytäntö (two-phase commit protocol, 2PC) eri muunnelmineen, joista esitetään keskeytysoletukseen (presumed abort) perustuva. Käytännön kaksi vaihetta ovat äänestys- ja päätösvaihe. Kun transaktio T pyytää sitoutumista, koordinoija aloittaa sitoutumiskäytännön ensimmäisen eli äänestysvaiheen (voting phase): 1. Koordinoija kirjaa lokiinsa valmiuskirjauksen (prepared log record) T,L,P, missä T on transaktion tunniste ja L on T :n kaikkien osallisten tunnisteiden lista (saatu T :n transaktiotietueesta). Operaationimeke P tarkoittaa sitoutumiseen valmistautumista (prepare-tocommit action). 2. Koordinoija pakottaa lokinsa levylle. 3. Koordinoija lähettää T :n kaikille osallisille s i sitoutumiseen valmistautumisviestin (prepare message) prepare(t, L). Viestin tarkoituksena on selvittää, onko T :n osallinen s i halukas sitouttamaan T :n s i :ssä toimivan alitransaktion T i, ja jos näin on, pyytää s i :tä valmistautumaan sitoutumiseen. 75

Valmistautumisviestin prepare(t, L) saatuaan T :n osallinen s i tallentaa L:n alitransaktion T i transaktiotietueeseen. Jos s i on halukas sitouttamaan T i :n, s i kirjaa lokiinsa valmiuskirjauksen T i,l,p ja pakottaa lokin levylle. Valmiuskirjauksen tehneen osallisen s i (tai alitransaktion T i ) sanotaan olevan valmiustilassa (prepared state) eli valmis sitoutumaan (prepared to commit) ja se voi vastata valmistautumisviestiin äänestysviestillä (vote message). Osallinen s i lähettää äänestysviestissä valmis-äänen (ready vote) vote(t, ready), jos s i on halukas sitouttamaan T i :n, ja keskeytys-äänen (abort vote) vote(t, abort), jos s i on jo keskeyttänyt alitransaktion T i tai on kyvytön sitouttamaan sitä jostain edellä kerrotusta syystä. Kun osallinen on antanut valmis-äänen, se ei voi enää muuttaa mieltään. Koordinoija näet käyttää tuota ääntä sen päättämiseen, pitääkö koko transaktio T sitouttaa vai ei. Äänestämisen jälkeen pisteen s i sitoutumisvalmis alitransaktio T i ei voi tehdä muuta kuin odottaa koordinoijan päätöstä, ja odotusaikana se ei voi vapauttaa lukkojaan eikä s i :n paikallinen transaktionhallitsin myöskään voi keskeyttää sitä. 76

Jos osallinen s i on antanut keskeytys-äänen, se keskeyttää ja peruuttaa alitransaktion T i paikallisen lokin perusteella, ellei ole tehnyt sitä jo aiemmin: 1. Pisteen s i lokiin kirjataan T i :n keskeytyskirjaus T i,a. 2. Suoritetaan T i :n tekemien päivitysten peruutusoperaatiot (käänteisoperaatiot) ja kirjataan ne s i :n lokiin toistokelpoisilla kirjauksilla. 3. Kirjataan s i :n lokiin T i :n peruutuksen päättämiskirjaus T i,l,c, missä transaktion osallisten tunnisteiden lista L on mukana, jos se on saatavilla (keskeytys tapahtuu valmistautumisviestin saamisen jälkeen). 4. Pakotetaan s i :n loki levylle. 5. Vapautetaan T i :n varaamat lukot. 6. Poistetaan T i :n tiedot s i :n transaktiotaulusta. Sitoutumiskäytäntö on T i :n osalta nyt päätöksessä. 77

Sitoutumiskäytännön toisessa vaiheessa eli päätösvaiheessa (decision phase) koordinoija odottaa kunkin osallisen vastausta, vastaanottaa osallisen antaman äänen ja kirjaa äänen T :n transaktiotietueeseen. Kun kaikki äänet on saatu tai äänestyksen määräaika on umpeutunut, koordinoija tekee päätöksen. Jos kaikki osalliset ovat määräajassa antaneet valmis-äänen, koordinoija päättää sitouttaa T :n. Jos taas jokin osallinen on antanut keskeytys-äänen tai ei ole äänestänyt määräajassa, koordinoija päättää keskeyttää ja peruuttaa T :n. 78

Transaktion T sitouttaminen sen koordinaatiopisteessä s 0 : 1. Koordinaatiopisteen s 0 lokiin kirjataan T :n sitoutumiskirjaus T,L,C, missä L on T :n osallisten tunnisteiden lista. 2. Pakotetaan s 0 :n loki levylle. 3. Merkitään T transaktiotauluun sitoutuneeksi ja vapautetaan T :n s 0 :ssa varaamat lukot. 4. Lähetetään T :n jokaiselle osalliselle s i sitoutumisviestillä (commit message) commit(t ) käsky sitouttaa T :n s i :ssä toimiva alitransaktio. 5. Kun kaikki osalliset ovat lähettäneet kuittauksen sitoutumisesta, s 0 :n lokiin kirjataan sitoutumiskäytännön päätöskirjaus (completion record, end record) T, E (pakottamatta lokia levylle) ja poistetaan T :n tiedot s 0 :n transaktiotaulusta. 79

Sitoutumisviestin saatuaan osallinen s i sitouttaa T i :n: 1. Pisteen s i lokiin kirjataan T i :n sitoutumiskirjaus T i,l,c, missä L on transaktion osallisten tunnisteiden lista. 2. Pakotetaan s i :n loki levylle. 3. Vapautetaan T i :n s i :ssa varaamat lukot. 4. Poistetaan T i :n tiedot s i :n transaktiotaulusta. 5. Lähetetään koordinoijalle kuittausviesti (acknowledgement, done message) done(t ). 80

Transaktion T keskeyttäminen sen koordinaatiopisteessä s 0 : 1. Lähetetään keskeytysviestillä (abort message) abort(t ) jokaiselle valmis-äänen antaneelle T :n osalliselle s i käsky keskeyttää T :n s i :ssä toimiva alitransaktio. 2. Kirjataan s 0 :n lokiin T :n keskeytyskirjaus T,A. 3. Suoritetaan T :n s 0 :ssa suorittamien päivitysten peruutusoperaatiot (käänteisoperaatiot) ja kirjataan ne koordinaatiopisteen lokiin toistokelpoisin kirjauksin. 4. Kirjataan s 0 :n lokiin T :n peruutuksen päättämiskirjaus T,L,C. 5. Pakotetaan s 0 :n loki levylle. 6. Vapautetaan T :n s 0 :ssa varaamat lukot. 7. Poistetaan T :n transaktiotietue koordinaatiopisteen s 0 transaktiotaulusta. Keskeytysviestin saanut osallinen s i keskeyttää ja peruuttaa T i kuten tapauksessa, jossa T i keskeytyy ja peruuntuu s i :n omasta päätöksestä. 81

Kun T :n koordinoija päättää sitouttaa T :n, se pakottaa T :n sitoutumiskirjauksen koordinaatiopisteen lokilevylle ennen sitoutumisviestien lähettämistä T :n osallisille. Jos näet sitoutumisviesti lähetettäisiin osalliselle ennen sitoutumiskirjauksen vientiä levylle, koordinoijan romahdus viestin lähetyksen jälkeen mutta ennen sitoutumiskirjauksen levyllevientiä johtaisi tietokannan epäeheään tilaan: T keskeytyy koordinaatiopisteessä, mutta sitoutuu osallispisteessä. Jos taas T :n koordinoija päättää keskeyttää T :n, keskeytysviestit voidaan lähettää osallisille ennen kuin koordinaatiopisteen lokiin viedään mitään tai lokia pakotetaan levylle. Tämä liittyy sitoutumiskäytännön keskeytysoletus-ominaisuuteen. 82

Esimerkki. Oletetaan, että sovellus sisältää kaksi SQL-lausetta, jotka kumpikin kohdistuvat kokonaisuudessaan pisteen s i tietokantaan. Sovellus: Koordinoija s 0 : Osallinen s i : begin transaction() uusi transaktio T ; T,B lokiin T :n SQL-lause s i :lle uusi transaktio T i ; T i,s 0,T,B lokiin; SQL-lauseen suoritus T i :n nimissä (onnistui) T :n SQL-lause s i :lle SQL-lauseen suoritus T i :n nimissä (onnistui) commit() T,{s 0,s i },P lokiin; lokin pakotus levylle; prepare(t,{s 0,s i }) s i :lle T i,{s 0,s i },P lokiin; lokin pakotus levylle; vote(t,ready) s 0 :lle T,{s 0,s i },C lokiin; lokin pakotus levylle; commit(t) s i :lle T i,{s 0,s i },C lokiin; lokin pakotus levylle; done(t ) s 0 :lle T,E lokiin; 83

Edellä oletettiin, että sovellus pyysi sitoutumista suorittamalla commit()-operaation. Oletetaan nyt, että sovellus pyytääkin transaktion keskeyttämistä ja peruuttamista suorittamalla rollback()-operaation. Silloin transaktion koordinoija lähettää transaktion kaikille osallisille keskeytysviestin ja keskeyttää ja peruuttaa transaktion koordinaatiopisteessä kuten siinä tapauksessa, että koordinoija olisi saanut valmistautumisviestiinsä vastauksena keskeytys-äänen joltakin osalliselta. Osalliset keskeyttävät ja peruuttavat asianomaisen alitransaktionsa. Erona aiempaan on, ettei koordinaatiopisteen ja osallisten lokeihin viedä valmiuskirjausta ja että kussakin pisteessä loki pakotetaan levylle vain kerran. 84

Sovellus: Koordinoija s 0 : Osallinen s i : begin transaction() uusi transaktio T ; T,B lokiin T :n SQL-lause s i :lle uusi transaktio T i ; T i,s 0,T,B lokiin; SQL-lauseen suoritus T i :n nimissä (onnistui) T :n SQL-lause s i :lle SQL-lauseen suoritus T i :n nimissä (epäonnistui) rollback() T,{s 0,s i },A lokiin; abort(t,{s 0,s i }) s i :lle; (päivitysten käänteis- T i,{s 0,s i },A lokiin; operaatiot, jos s 0 :ssa päivitysten käänteisolisi T :n päivityksiä) operaatiot; T,{s 0,s i },C lokiin; T i,{s 0,s i },C lokiin; lokin pakotus levylle lokin pakotus levylle 85

Usean alueen ylittävä atominen sitoutuminen Edellä olemme olettaneet, että hajautetun transaktion koordinoinnista huolehtii yksi transaktionhallitsin. Todellisuudessa transaktionhallitsimen vastuu rajoittuu usein yhteen alueeseen (domain), joka tyypillisesti sisältää kaikki transaktionhallitsimen toimintapisteen tietokantojen (tai yleisemmin resurssien) hallitsimet. Kun alueen D 1 sovellusohjelma kutsuu toisen alueen D 2 resurssinhallitsinta, kummankin alueen transaktionhallitsimia informoidaan. Alueen D 2 transaktionhallitsinta pidetään D 1 :n transaktionhallitsimen lapsena. Alueen resurssinhallitsimia pidetään puolestaan alueen transaktionhallitsimen lapsina. Yleisessä tapauksessa sovelluksen kutsumat transaktionhallitsimet ja resurssinhallitsimet muodostavat puun, jonka juurena on sovelluksen sisältävän alueen transaktionhallitsin ja lehtisolmuina transaktion osallistujien resurssinhallitsimet. Puun sisäsolmu esittää transaktionhallitsinta, joka koordinoi alueensa resurssinhallitsimia ja toimii osallistujana suhteessa vanhempaansa. 86

Atomisen sitoutumiskäytännön viestit kulkevat pitkin transaktionhallitsimista ja resurssinhallitsimista koostuvan puun särmiä. Oletetaan, että alueen D 1 transaktio operoi paikallisten resurssinhallitsimien RM a ja RM b hallitsemiin resursseihin (tietokantoihin), alueen D 2 resurssinhallitsimien RM c ja RM d hallitsemiin resursseihin sekä alueen D 3 resurssinhallitsimen RM e hallitsemaan resurssiin. Merkitään D i :n transaktionhallitsinta TM i :llä. Silloin TM 1 :n lapsia ovat RM a, RM b, TM 2 ja TM 3, TM 2 :n lapsia ovat RM c ja RM d, ja TM 3 :n lapsi on RM e. TM 1 RM a RM b TM 1 TM 2 RM c RM d RM e 87

Sovellus lähettää commit()-lauseella sitoutumispyynnön TM 1 :lle, joka aloittaa kaksivaiheisen sitoutumiskäytännön äänestysvaiheen lähettämällä sitoutumiseen valmistautumisviestit lapsilleen RM a, RM b, TM 2 ja TM 3. Kun TM 2 ja TM 3 saavat valmistautumisviestit, ne aloittavat puolestaan sitoutumiskäytännön äänestysvaiheen omien lastensa kesken, so. lähettämällä lapsilleen RM c, RM d ja RM e valmistautumisviestit. Lapsiltaan vastaanottamiensa äänten perusteella TM 2 vastaa TM 1 :lle valmis-äänellä, jos molemmat lapset antoivat valmis-äänen, ja keskeytys-äänellä muutoin. Samoin menettelee TM 3 omalta lapseltaan vastaanottamansa äänen perusteella. Kun TM 1 on vastaanottanut äänet lapsiltaan RM a, RM b, TM 2 ja TM 3, se aloittaa sitoutumiskäytännön päätösvaiheen. Jos TM 1 :n vastaanottamat äänet olivat kaikki valmis-ääniä, TM 1 lähettää sitoutumisviestin lapsilleen RM a, RM b, TM 2 ja TM 3. Sitoutumisviestin saatuaan TM 2 lähettää puolestaan sitoutumisviestit lapsilleen RM c ja RM d ja TM 3 samoin lapselleen RM d. 88

Transaktionhallitsin TM 2 toimii siis alueensa resurssinhallitsimien RM c ja RM d edustajana suhteessa vanhempaansa eli transaktionhallitsimeen TM 1 ja on siis hajautetun transaktion käsittelyssä osallisen asemassa suhteessa koordinoijaan TM 1. Samoin TM 3 on RM e :n edustaja ja osallinen suhteessa TM 1 :een. TM 1 :lle pitää siis tiedottaa, että TM 2 ja TM 3 ovat sen koordinoiman transaktion osallisia, TM 2 :lle tiedottaa sen kaksoisroolista toisaalta suhteessa RM c :hen ja RM d :hen sekä toisaalta suhteessa TM 1 :een, ja TM 3 :lle tiedottaa sen kaksoisroolista suhteessa RM e :hen sekä TM 1 :een. Hajautettujen transaktioiden X/Open-käsittelymallissa mainitun informaation levittämistehtävä on asetettu erityiselle palvelimelle (communication-resource manager). 89

Häiriöiden käsittely kaksivaiheisessa sitoutumiskäytännössä Edellä esitetty kaksivaiheisen sitoutumiskäytännön kuvaus on epätäydellinen sikäli, ettei siinä ole selostettu, miten toimitaan tietyissä häiriö- tai poikkeustilanteissa. Aikakatkaisukäytäntö (timeout protocol) tarvitaan siltä varalta, ettei piste joudu odottamaan viestiä ikuisesti esim. sen vuoksi, että viestin lähettävä piste on romahtanut, viesti menetetään tai viestin toimitusjärjestelmä on hyvin hidas. Häiriöstä elvytyskäytäntö (restart-recovery protocol) tarvitaan pisteen elvyttämiseksi järjestelmäromahduksesta. Jos piste ei pysty päättämään sitoutumiskäytäntöä ennen kuin häiriö korjataan, sanomme pisteen olevan estynyt (blocked). Kun piste estyy, sitoutumis- tai keskeytyspäätös viivästyy määräämättömäksi ajaksi. Viivästyminen on erityisen epäsuotavaa osallispisteessä, joka käyttää lukitusperustaista samanaikaisuuden hallintaa, koska alitransaktion lukitsemat tietoalkiot pysyvät muiden transaktioiden ulottumattomissa. 90

Tämän vuoksi on tärkeää ymmärtää ne tilanteet, joissa kaksivaiheisen sitoutumisen tuloksena voi olla osallispisteen estyminen. Seuraavassa tarkastellaan häiriötilanteita ikään kuin sitoutumiskäytännön puurakenne olisi kaksitasoinen; samat päätökset tehdään vanhemman ja lapsen välillä myös monitasoisen puun tapauksessa aina kahdella vierekkäisellä puun tasolla. (1) Osallisen aikakatkaisu sitoutumiseen valmistautumisviestiä odottaessa. Osallinen voi olla varma, ettei mitään päätöstä sitoutumisesta tai keskeytyksestä ole vielä tehty, koska kerran osallinen ei ole vielä päässyt äänestämään siitä. Osallinen voi sen vuoksi yksipuolisella päätöksellään keskeyttää transaktion. Jos valmistautumisviesti sitten kuitenkin saapuu, osallinen voi vastata yksikertaisesti antamalla keskeytys-äänen. (2) Koordinoijan aikakatkaisu äänestysviestiä odottaessa. Tämä tilanne muistuttaa edellistä. Koordinoija voi yksipuolisesti päättää keskeyttää transaktion ja lähettää keskeytysviestin kaikille osallisille. On mahdollista, että kaikki osalliset ovat lähettäneet valmis-äänen, mutta yksi näistä ei ole ehtinyt perille ennen aikakatkaisua. Tässä tapauksessa tulee siis keskeytetyksi transaktio, vaikka kaikki sen osallispisteet ovat toiminnassa ja alitransaktiot päässeet onnistuneesti loppuun. 91

(3) Osallisen aikakatkaisu sitoutumis- tai keskeytysviestiä odottaessa. Tämä tilanne on edellä mainittuja vakavampi, koska osallinen on antanut valmis-äänen ja on nyt valmiustilassa. Osallinen on estynyt, kunnes se voi saada selvyyden, onko koordinoija tehnyt päätöksen ja mikä päätös on. Osallinen ei voi yksipuolisesti sitouttaa eikä keskeyttää transaktiota, koska koordinoija on saattanut tehdä vastakkaisen päätöksen. Osallinen voi yrittää kommunikoida koordinoijan kanssa ja tiedustella transaktion tilaa. Jos tämä ei ole mahdollista (esim. koordinaaatiopisteen romahduksen tai verkon osittumisen vuoksi), osallinen voi yrittää tiedustella päätöstä muilta pisteiltä, jotka mahdollisesti ovat saman hajautetun transaktion osallisia. 92

Tällaisen tilanteen varalta transaktion koordinoija on lähettänyt valmistautumisviestissä listan transaktion kaikista osallisista. Tämän listan osallinen tallentaa valmistautumisoperaation lokikirjaukseen. Jos osallinen löytää saman transaktion toisen osallisen, joka ei vielä ole äänestänyt, molemmat voivat päättää keskeyttää transaktion. Tämä on turvallista, koska koordinoija ei ole voinut päättää sitoutumisesta: yhdeltä osallistujaltahan on ääni vielä saamatta. Jos taas osallinen löytää saman transaktion toisen osallisen, jossa transaktio on sitoutunut tai keskeytynyt, osallinen tekee saman päätöksen. Pahimmassa tapauksessa kaikki osallisen löytämät muut osalliset ovat myös valmiustilassa, jolloin osallinenkin jää estyneeksi, kunnes se saa yhteyden koordinoijaan tai johonkin päätöksen toteuttaneeseen osalliseen. 93

Pisteen elvytys häiriöstä Piste s i elvytetään häiriöstä suorittamalla ARIES-algoritmin analyysi-, toisto- ja peruutusvaiheet. Analyysivaiheessa (analysis pass) s i :n lokia selataan viimeksi otetun tarkistuspisteen aloituskirjauksesta lähtien lokin loppuun asti ja rekonstruoidaan transaktiotaulu sekä päivitettyjen sivujen taulu. Selauksen aikana suoritetaan samat toimenpiteet kuin keskitetyn tietokannan tapauksessa, mutta aktiiviset transaktiot eritellään nyt viiteen ryhmään: (1) Pisteen s i koordinoimat etenevät transaktiot, joilla ei ole lokissa valmiuskirjausta. (2) Muiden pisteiden s j koordinoimien transaktioiden etenevät alitransaktiot, joilla ei ole lokissa valmiuskirjausta. (3) Pisteen s i koordinoimat sitoutumisvalmiit transaktiot, so. etenevät transaktiot, joilla on lokissa valmiuskirjaus. (4) Muiden pisteiden koordinoimien transaktioiden sitoutumisvalmiit alitransaktiot, so. etenevät alitransaktiot, joilla on lokissa valmiuskirjaus. (5) Keskeytyneet transaktiot. Lisäksi transaktiotauluun jätetään: (6) Pisteen s i koordinoimat sitoutuneet transaktiot T, joilta puuttuu lokista sitoutumiskäytännön päätöskirjaus T,E. 94

ARIES-algoritmin toistovaihe (redo pass) suoritetaan s i :ssä kuten keskitetyssä tietokannassa: Lokia selataan LSN-arvosta Redo-LSN = min{rec-lsn(p) p on päivitettyjen sivujen taulussa} lokin loppuun. Aina kun tavataan sivulle p kohdistuneen päivityksen kirjaus, verrataan kirjauksen LSN:ää n päivitettyjen sivujen taulun Rec-LSN(p)- arvoon. Mikäli n Rec-LSN(p), sivu p kirjoitussalvataan ja tutkitaan Page- LSN(p):tä. Mikäli n > Page-LSN(p), päivitys puuttuu sivulta p, joten se toteutetaan lokikirjauksen avulla sivulle p ja Page-LSN(p) edistetään arvoon n. 95

ARIES-algoritmin peruutusvaihe (undo pass) suoritetaan s i :ssä seuraavasti: Ryhmien 1, 2 ja 3 transaktiot keskeytetään ja peruutetaan. Ryhmien 1 ja 2 transaktiot eivät näet ole valmiustilassa, joten s i voi keskeyttää ne yksipuolisella päätöksellään. Ryhmien 1 ja 3 transaktioiden sitoutumisesta päätösvalta on s i :llä. Ryhmän 5 transaktioiden peruutus päätetään. Ryhmän 4 transaktioiden (eli muiden pisteiden koordinoimien sitoutumisvalmiiden transaktioiden) kohtalo on epäselvä (in-doubt transaction): transaktio voi olla sitoutunut tai keskeytynyt muissa pisteissä. Näille transaktioille hankitaan lokin perusteella lukot transaktion käsittelemiin tietoalkioihin. Jotta lukkojen hankinta olisi mahdollista, päivityksen lokikirjaukseen on sisällyttävä päivityksen suojaamiseksi tarvittavien lukkojen nimet. Esimerkiksi avainvälilukituskäytännössä avainarvolla x varustetun monikon poisto-operaatio suojataan pitkäkestoisella kirjoituslukolla avainarvon x seuraajaan y, josta määrätty lukon nimi (hajautusarvo) täytyy siis sisällyttää lokikirjaukseen. 96

Peruutusvaiheen käynnistyttyä piste s i tiedottaa kunkin ryhmään 2 kuuluvan transaktion koordinoijalle transaktion keskeytymisestä. Koordinoija on analyysivaiheessa saatu selville transaktion aloituskirjauksesta ja viety transaktiotietueeseen rekonstruoidussa transaktiotaulussa. Kunkin ryhmään 3 kuuluvan transaktion keskeytymisestä s i tiedottaa transaktion kaikille osallisille. Osalliset on analyysivaiheessa saatu selville valmiuskirjauksesta ja viety transaktiotietueeseen. Ryhmään 1 kuuluvien transaktioiden osallisia ei saada selville s i :n lokista, koska valmiuskirjausta ei siellä ole. Pisteen s i koordinoiman transaktion transaktiotietue kyllä sisälsi osallisten listan, mutta transaktiotauluhan menetettiin häiriön yhteydessä. Mutta tällaisen transaktion mahdolliset muut osalliset ovat kyllästyneet odottamaan valmistautumisviestiä koordinoijalta ja keskeyttäneet ja peruuttaneet alitransaktionsa yksipuolisella päätöksellään. 97

Kunkin ryhmään 4 kuuluvan alitransaktion T i kohtaloa s i :n täytyy tiedustella transaktion T koordinoijalta s 0, missä T i on T :n alitransaktio. Transaktio T ja sen koordinoija s 0 on analyysivaiheessa saatu selville T i :n aloituskirjauksesta. Tiedustelu voidaan osoittaa T :n kaikille muillekin osallisille, sillä T i :n valmiuskirjaus s i :n lokissa sisältää listan kaikista osallisista. Jos saadaan tieto, että T on sitoutunut, viedään s i :n lokiin T i :n sitoutumiskirjaus, pakotetaan loki levylle ja vapautetaan T i :lle s i :ssä hankitut lukot. Jos taas saadaan tieto, että T on keskeytynyt, viedään s i :n lokiin T i :n keskeytyskirjaus, suoritetaan T i :n peruutusvaiheen operaatiot T i :lle s i :ssä hankittujen lukkojen turvin ja päätetään peruutus T i :n peruutuksen päättämiskirjauksella, lokin levylle pakotuksella ja lukkojen vapautuksella. 98

Tarkastellaan vielä tapaa, jolla transaktion T koordinoija s 0 vastaa T :n osallisen s i tiedusteluun T :n kohtalosta, kun häiriöstä elpyvä s i on havainnut T :n s i :ssä toimineen alitransaktion T i sitoutumisvalmiiksi. Koordinoija pystyy aina vastaamaan tiedusteluun lokiaan tutkimatta: Mikäli koordinoijan transaktiotaulu sisältää yhä T :n transaktiotietueen, koordinoija voi sen perusteella vastata tiedusteluun; muutoin koordinoija vastaa T :n olevan keskeytynyt. Tätä esittämämme kaksivaiheisen sitoutumiskäytännön useimmiten sovelletun muunnelman piirrettä kutsutaan nimellä keskeytysoletus (presumed abort). 99

Keskeytysoletus toimii, koska T :n transaktiotietueen puuttuminen koordinoijan transaktiotaulusta merkitsee, että jokin seuraavista pätee: (1) Koordinoija on sitouttanut T :n, saanut kuittausviestit kaikilta osallisilta, kirjannut T :n päätöskirjauksen T, E ja poistanut T :n transaktiotietueen. (2) Koordinoija on romahtanut ja löytänyt elvytyksen analyysivaiheessa lokistaan T :n päätöskirjauksen, joten T :n transaktiotietue on jätetty pois rekonstruoidusta transaktiotaulusta. (3) Koordinoija on keskeyttänyt T :n ja poistanut T :n transaktiotietueen. (4) Koordinoija on romahtanut ja elvytyksen analyysivaiheessa ei ole löytynyt mitään T :n kirjauksia lokista. Koska osallinen s i on yhä valmiustilassa (eikä ole sen vuoksi voinut lähettää kuittausta sitoutumisesta), tapaukset (1) ja (2) eivät ole mahdollisia. Sama päättely pätee tilanteeseen, jossa valmiustilassa olevan alitransaktion suorituspiste on kyllästynyt odottamaan transaktion koordinoijan päätöstä ja tiedustelee sen vuoksi transaktion kohtaloa koordinoijalta. 100

Hajautettujen transaktioiden X/Open-käsittelymalli Kaksivaiheinen sitoutumiskäytäntö sitoo yhteen eri ohjelmistokomponentteja kuten tietokannanhallitsimia ja transaktionhallitsimia, jotka saattavat olla peräisin eri ohjelmistotoimittajilta. Jotta ohjelmistokomponentit voisivat toimia tehokkaasti keskenään ja jotta sovellusohjelmat voisivat kommunikoida niiden kanssa, niiden pitää sopia eri komponenttien välisistä liittymistä. Liittymien standardointi edesauttaa eri ohjelmistotoimittajien tuotteiden yhteentoimivuutta. X/Open-standardin hajautettujen transaktioiden käsittelymalli toteuttaa yhteentoimivuuden määrittelemällä joukon funktiokutsuja sovellusten, transaktionhallitsimien ja resurssinhallitsimien välisten viestien vaihtoa varten sekä määrittämällä näiden viestien muodon. 101

X/Open-standardissa sovelluksen funktiokutsujen tx-liittymä sisältää mm. seuraavat transaktionhallitsimen kutsut: tx begin(): sovellus aloittaa uuden transaktion; transaktionhallitsin luo uuden transaktiotunnisteen ja palauttaa sen sovellukselle. tx commit(): sovellus pyytää transaktion sitoutumista; transaktionhallitsin koordinoi sitoutumiskäytännön suorittamisen; kutsu palauttaa joko arvon committed (kun transaktio sitoutui) tai arvon aborted (kun transaktio keskeytyi). tx rollback(): sovellus pyytää transaktion keskeyttämistä ja peruuttamista; transaktionhallitsin koordinoi transaktion keskeyttämisen ja peruuttamisen. 102

X/Openissa resurssinhallitsimen (tietokannanhallitsimen) ja transaktionhallitsimen välisten funktiokutsujen xa-liittymä sisältää mm. seuraavat kutsut: xa reg(): resurssinhallitsin ilmoittaa transaktionhallitsimelle liittyneensä transaktioon T, kun resurssinhallitsin on saanut sovellukselta ensimmäisen T :hen liittyvän palvelupyynnön. xa prepare(): transaktionhallitsin lähettää valmistautumisviestin resurssinhallitsimelle; kutsu palauttaa joko arvon ready (kun resurssinhallitsin on valmis sitouttamaan transaktion) tai aborting (kun resurssinhallitsin keskeyttää transaktion). xa commit(): transaktionhallitsin käskee resurssinhallitsinta sitouttamaan transaktion. xa abort(): transaktionhallitsin käskee resurssinhallitsinta keskeyttämään transaktion. 103

Hajautettu lukkiuma Hajautetussa tietokannassa voi yksittäisen pisteen transaktioiden keskisten lukkiumien lisäksi esiintyä hajautettuja lukkiumia (distributed deadlock) esimerkiksi seuraavasti. Pisteessä s 1 transaktion T alitransaktio T 1 varaa kirjoituslukon tietoalkioon x 1. varaa kirjoituslukon tie- Pisteessä s 2 transaktion T alitransaktio T 2 toalkioon x 2. Pisteessä s 1 transaktion T alitransaktio T 1 pyytää lukkoa x 1:een ja joutuu odottamaan. Pisteessä s 2 transaktion T alitransaktio T 2 pyytää lukkoa x 2 :een ja joutuu odottamaan. Kumpikaan transaktioista T ja T ei voi edetä: lukkiuma! Kummankaan pisteen alitransaktioiden kesken ei lukkiumaa esiinny. 104

Keskitetyn tietokannan lukkiumien esto- ja havaitsemismenetelmät voidaan yleistää hajautettuun tietokantaan. Samoin aikaleimajärjestyksen käyttö (wait-or-die, wound-or-wait). Suoraviivaisin menettely lukkiumien käsittelemiseksi niin keskitetyssä kuin hajautetussakin tietokantajärjestelmässä on aikakatkaisu (timeout): Aina kun pisteen s i transaktio joutuu odottamaan pyytämäänsä lukkoa kauemmin kuin etukäteen asetetun kynnysajan, s i päättelee, että ylipitkään odotusaikaan on syynä lukkiuma (tai jonkin pisteen tai linkin häiriö), ja keskeyttää transaktion yksipuolisella päätöksellään. Tällainen transaktio ei näet voi olla valmiustilassa, koska se kerran ei ole vielä päässyt suorittamaan kaikkia operaatioitaan. 105

Todellisten lukkiumien havaitsemiseksi pisteiden täytyy välittää toisilleen tietoa pisteen transaktioiden keskisistä odotuksista. Kun hajautetun transaktion T alitransaktio joutuu pisteessä s i odottamaan hajautetun transaktion T alitransaktiota, s i ilmoittaa T :n koordijoijalle odotussuhteesta T T. T :n koordinoija lähettää puolestaan tiedusteluviestin (probe message) T :n koordinoijalle. Jos T :n koordinoija on saanut ilmoituksen odotussuhteesta, jossa jokin sen koordinoiman transaktion alitransaktioista odottaa jonkin transaktion T alitransaktiota, T :n koordinoija välittää tiedusteluviestin edelleen T :n koordinoijalle. Lukkiuma havaitaan, jos tiedusteluviesti palaa T :n koordinoijalle. 106

Globaali sarjallistuvuus Keskitetyssä järjestelmässä transaktioiden samanaikaisuuden hallinnan tavoitteena on tahdistaa transaktioiden tietoalkioihin kohdistamat luku- ja päivityspyynnöt niin, että kukin transaktio tulee ajetuksi sille asetetulla eristyvyystasolla (isolation level), kuten esim. yhdellä neljästä SQL:n eristyvyystasosta (read uncommitted, read committed, repeatable read, serializable). Hajautettu transaktio operoi useampaan tietokantajärjestelmään, joissa samanaikaisuutta saatetaan hallita eri menetelmin ja joissa ei ole tarjolla samoja eristyvyystasoja. Transaktion eristyvyystaso saattaa siten olla huonosti määritelty. Periaatteessa kaikki keskitetyn tietokannan eristyvyyskäsitteet yleistyvät suoraviivaisesti hajautettuun tietokantaan, jossa mitään tietoalkiota ei ole toisinnettu useampaan pisteeseen. Esimerkiksi hajautetun transaktion T alitransaktion T i pisteessä s i tekemä päivitysoperaatio W[x] on likainen kirjoitus (dirty write), jos tietoalkio x on jonkin toisen, vielä aktiivisen transaktion T pisteessä s i toimivan alitransaktion T i päivittämä. Vastaavasti yleistyvät eristyvyysanomaliat likainen luku (dirty read) ja toistokelvoton luku (unrepeatable read). 107

Eristyvyysanomalioiden avulla voidaan edelleen määritellä SQL:n eristyvyystasot hajautetuille transaktioille. Korkeinta tasoa kutsutaan globaaliksi sarjallistuvuudeksi (global serializability). Oletetaan, että kukin piste s i hallitsee omiin tietoalkioihinsa kohdistuvien luku- ja päivitysoperaatioiden tahdistuksen ankaralla kaksivaiheisella lukituskäytännöllä, jossa siis s i :ssä toimivat transaktiot suojavat operaationsa pitkäkestoisilla (eli vasta sitoutumisen jälkeen vapautettavilla) lukoilla. Toisin sanoen kukin piste s i takaa omille paikallisille transaktioilleen sekä s i :ssä toimiville hajautettujen transaktioiden alitransaktioille (paikallisen) sarjallistuvuuden. Oletetaan vielä, että hajautettujen transaktioiden sitoutuminen koordinoidaan kaksivaiheisella sitoutumiskäytännöllä. Voidaan näyttää, että silloin jokainen hajautettu transaktio on globaalisti sarjallistuva. 108

Tarkastellaan esimerkkiä, jossa kaksi hajautettua transaktiota, T ja T, eivät ole globaalisti sarjallistuvia: Pisteessä s i on T :llä alitransaktio T i ja T :lla alitransaktio T i. Samaan s i :n tietoalkioon x i kohdistuvan konfliktoivan operoinnin vuoksi alitransaktiot sarjallistuvat paikallisesti järjestykseen T i < T i. Pisteessä s j on T :llä alitransaktio T j ja T :lla alitransaktio T j. Samaan s j :n tietoalkioon x j kohdistuvan konfliktoivan operoinnin vuoksi alitransaktiot sarjallistuvat paikallisesti järjestykseen T j < T j. Pisteessä s i alitransaktio T i voi operoida x i :hin vasta kun T i on vapauttanut x i :hin varaamansa lukon. Ankarassa kaksivaihelukinnassa tämä voi tapahtua vasta, kun T i on sitoutunut. Siis T i sitoutuu ennen T i :tä. Pisteessä s j alitransaktio T j voi operoida x j :hin vasta kun T j on vapauttanut x j :hin varaamansa lukon. Ankarassa kaksivaihelukinnassa tämä voi tapahtua vasta, kun T j on sitoutunut. Siis T j sitoutuu ennen T j :tä. Jompikumpi hajautetuista transaktioista T ja T ei siis noudata kaksivaiheista sitoutumiskäytäntöä, koska alitransaktioiden keskinäinen sitoutumisjärjestys on vastakkainen pisteissä s i ja s j. 109

Heikommat sitoutumiskäytännöt Käytännössä on tilanteita, joissa atomista sitoutumiskäytäntöä ei voida saattaa päätökseen, jolloin siis globaalia atomisuutta ei voida taata. Transaktion osallispisteessä ei välttämättä ole lainkaan käytössä kaksivaiheista sitoutumiskäytäntöä. Resurssinhallitsin voi olla perinnejärjestelmä (legacy system), jossa ei tunneta transaktion valmiustilaa. Tällöin piste ei pysty osallistumaan sitoutumiskäytäntöön. Transaktion osallispiste saattaa myös välttää osallistumasta sitoutumiskäytäntöön pisteen suorituskyvyn vaarantumisen pelossa: valmiustilassa olevan transaktion varaamat lukot estävät muilta transaktioilta pääsyn lukittuihin tietoalkioihin. Piste ei ehkä myöskään halua menettää itsenäisyyttään. Koska piste ei voi itse määrätä valmiustilan kestoa, se ei enää ole itsenäinen: lukittuihin resursseihin pääsyä valvotaan muualta. 110

Osallispiste, joka suostuu osallistumaan kaksivaiheiseen sitoutumiskäytäntöön, usein ratkaisee estymisongelman päättämällä yksipuolisesti sitouttaa tai keskeyttää estyneen alitransaktion vapauttaakseen tämän varaamat lukot. Tällainen päätös voi olla ristiriidassa transaktion koordinoijan päätöksen kanssa ja aiheuttaa siten tietokannan eheyden rikkoutumisen, mikä täytyy myöhemmin korjata. Osallispiste voi myös muista syistä jättää osallistumatta sitoutumiskäytäntöön. Piste saattaa veloittaa maksun alitransaktion suorittamisesta ja vaatia maksun suoritettavaksi alitransaktion päästyä loppuun ja palautettua tuloksen, vaikka koko hajautettu transaktio lopulta keskeytyisikin. Pisteen tietokannan valvojan vaatimuksesta alitransaktion pitääkin sitoutua heti tuloksen palautettuaan, odottamatta hajautetun transaktion sitoutumista tai keskeytymistä. 111

Sovelluksen ohjelmointikielessä ei välttämättä ole kaksivaiheisen sitoutumisen toteuttavia funktioita. Tietokannan kyselykielellä saattaa olla mahdollista yhdistää transaktio useampaan tietokantapalvelimeen, mutta kaksivaiheista sitoutumista ei ole toteutettu. Kun transaktio pääsee loppuun, se lähettää erilliset (toisistaan riippumattomat) sitoutumispyynnöt kullekin palvelimelle, jotka sitten sitouttavat tai keskeyttävät alitransaktionsa toisistaan riippumatta. Esimerkiksi useimmat sulautetut SQL-liittymät eivät tarjoa kaksivaiheista sitoutumista. JDBC (Java DataBase Connectivity) ja ODBC (Open DataBase Connectivity) kumpikin sisältävät sovellusohjelmointiliittymät, jotka toteuttavat kaksivaiheisen sitoutumisen: JTS (Java Transaction Service) ja MTS (Microsoft Transaction Server). 112

Hajautettu tietokantajärjestelmä ei mahdollisesti lainkaan tarjoa kaksivaiheista sitoutumista. Kaksivaiheisen sitoutumiskäytännön toteutus edellyttää, että järjestelmän väliohjelmisto sisältää transaktioiden koordinoijan (transaktionhallitsimen) ja että sovelluksella, koordinoijalla ja tietokantapalvelimilla on yhteisymmärrys sitoutumiskäytännön viestien vaihtomekanismista ja viestien muodosta. X/Open-standardi määrittää ohjelmointiliittymät tähän tarkoitukseen (tx- ja xa-liittymät). Kaikille sovelluksille sellaista järjestelmätukea ei ole saatavilla, jolloin myöskään kaksivaiheista sitoutumista ei voi toteuttaa. 113

Kun transaktion osallispiste ei osallistu kaksivaiheiseen (tai muuhun atomiseen) sitoutumiskäytäntöön, sovellussuunnittelijan on huolellisesti arvioitava, miten tästä johtuva mahdollinen globaalin atomisuuden tai eristyvyyden rikkoutuminen vaikuttaa tietokannan eheyteen ja sitä kautta sovelluksen perimmäiseen hyödyllisyyteen asiakkailleen. Kun kaksivaiheista sitoutumiskäytäntöä ei ole käytettävissä, joudutaan turvautumaan johonkin heikompaan sitoutumiskäytäntöön. Oletuskäytäntönä mm. JDBC:ssä ja ODBC:ssä on lausetason automaattinen sitoutumiskäytäntö (autocommit protocol), jossa sitoutumisoperaatio suoritetaan automaattisesti jokaisen SQL-lauseen suorituksen jälkeen. 114

Nollavaiheisessa sitoutumiskäytännössä (zero-phase commit protocol) hajautetun transaktion eri osallispisteiden alitransaktiot sitoutuvat toisistaan riippumatta heti päästyään onnistuneesti loppuun (ja peruuntuvat muutoin). Transaktion jotkin alitransaktiot siis sitoutuvat ja jotkin peruuntuvat. Yksivaiheisessa sitoutumiskäytännössä (one-phase commit protocol) sovellus ei lähetä mitään sitoutumis- tai keskeytysviestejä hajautetun transaktion eri osallispistelle, ennen kuin nämä ovat ilmoittaneet alitransaktion pääsystä onnistuneesti loppuun tai keskeytymisestä. Jos kaikki alitransaktiot pääsevät loppuun onnistuneesti, lähetetään sitoutumiskäsky kaikille osallisille, muutoin keskeytyskäsky kaikille osallisille. Tässä käytännössä jotkin alitransaktiot saattavat sitoutua ja jotkin keskeytyä. Sulautetulla SQL:llä toteutettu hajautettu transaktio saattaa toimia tällä tavoin. 115

Mikään mainituista heikommista sitoutumiskäytännöistä ei takaa globaalia atomisuutta, koska transaktion jotkin alitransaktiot voivat sitoutua ja toiset keskeytyä. Globaali sarjallistuvuus on kuitenkin taattu, jos seuraavat ehdot ovat voimassa: (1) Kunkin pisteen samanaikaisuuden hallinta perustuu paikallisen sarjallistuvuuden takaavaan lukituskäytäntöön tai optimistiseen käytäntöön. (2) Sovellusohjelma käyttää yksivaiheista sitoutumiskäytäntöä. (3) Kaikkien osallispisteiden alitransaktiot sitoutuvat. 116

Nollavaiheisessa sitoutumiskäytännössä hajautetun transaktion yhden osallispisteen alitransaktio voi sitoutua ja vapauttaa lukkonsa ennen kuin toisen pisteen alitransaktio on edes aloitettu ja varannut lukkoja siellä. Eristyvyysanomaliat ovat siis mahdollisia, vaikka kaikki alitransaktiot sitoutuvat. Globaali sarjallistuvuus ei siis ole taattu. Kahden hajautetun transaktion T ja T osallispisteen s i alitransaktioiden T i ja T i keskinäinen sarjallistuvuusjärjestys saattaa olla T i < T i, kun taas jonkin toisen osallispisteen s j alitransaktioille T j ja T j se onkin T j < T j. Nollavaiheisessa sitoutumiskäytännössä alitransaktiot pitävät lukkoja varattuna vähemmän aikaa kuin yksivaiheisessa sitoutumiskäytännössä, joten se on tehokkaampi. Nollavaiheinen sitoutumiskäytäntö sopii sellaisiin sovelluksiin, joissa hajautetussa tietokannassa ei tarvitse ylläpitää mitään globaaleja, useamman pisteen tietokantojen välisiä eheysrajoitteita. Silloinhan globaali sarjallistuvuus ei ole välttämätön. 117

Esimerkkinä sovelluksesta, jonka koordinointiin riittää nollavaiheinen sitoutumiskäytäntö, olkoon aiemmin mainittu verkkokauppasovellus. Verkkokaupalla on päätoimipiste, joka rekisteröi asiakkaat ja hyväksyy tavaratilaukset, sekä eri puolilla maata joukko varastopisteitä, joista tilatut tavarat toimitetaan asiakkaille. Kunkin asiakkaan tiedot säilytetään sekä päätoimipisteessä että siinä varastopisteessä, josta asiakkaan tilaamat tavarat toimitetaan. Asiakkaan rekisteröintitransaktio voisi koostua kahdesta alitransaktiosta, jotka suoritetaan seuraavassa järjestyksessä: ensimmäinen alitransaktio luo asiakastietueen päätoimipisteessä ja toinen alitransaktio luo vastaavan tietueen asianomaisessa varastopisteessä. Rekisteröintitransaktion annetaan sitoutua nollavaiheisesti: ensimmäinen alitransaktio saa sitoutua ennen toisen alkamista. Näin koneensa ääressä istuvalle asiakkaalle taataan nopea palaute rekisteröinnin onnistumisesta. 118