Hajautettujen järjestelmien perusteet Transaktiot - kertausta Distributed Systems, Concepts and Design, George Coulouris, Jean Dollimore, Tim Kindberg Addison-Wesley 1988,1994. Pearson Education 2001 ISBN: 0201-61918-0) 2012 OHJ-5010, Hajap, Kari Systä 1
Lukitaan muuttujat sitä mukaa kun niitä käytetään Jos jollakin on jo lukko, niin odotetaan Ja avataan lopussa Kasvuvaihe (grow) and kutistusvaihe (shrink) Kutsutaan kaksivaiheiseksi lukitsemiseksi (two-phase locking) Strict versiossa kaikki lukot vapautetaan vasta kommitissa tai abortissa Lukot 2012 OHJ-5010, Hajap, Kari Systä 2
Esimerkki lukoista Transaktio 1: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); Transaktio 2: m:=b.saldo(); b.aseta(1.1*m); c.nosto(m/10); 2012 OHJ-5010, Hajap, Kari Systä 3
Operaatio Lukot Operaatio Lukot opentransaction() m:=b.saldo() lock B b.aseta(1.1*m) opentransaction() a.nosto(m/10) lock A m:=b.saldo() wait B closetransaction() unlock A, B b.aseta(1.1*m); c.nosto(m/10); lock B lock C closetransaction() unlock B,C 2012 OHJ-5010, Hajap, Kari Systä 4
Toinen esimerkki - voiko lukkiintua? Transaktio 1: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); Transaktio 2: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); Lukkiintuminen tapahtuu jos T1 odottaa T2:a ja T2 odottaa T1:ä. 2012 OHJ-5010, Hajap, Kari Systä 5
Odotusgraafi varattu T1 B odottaa T2 odottaa A varattu 2012 OHJ-5010, Hajap, Kari Systä 6
Toinen esimerkki - voiko lukkiintua? Transaktio 1: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); Transaktio 2: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); Kummallekin pätee: Lukkoa B pyydetään vain silloin kun yhtään lukkoa ei ole hallussa Lukkoa A pyydetään vain silloin kun lukko B on saatu Silmukkaa ei siis voi syntyä 2012 OHJ-5010, Hajap, Kari Systä 7
Entä tämä? Transaktio 1: m:=a.saldo(); a.aseta(1.1*m); b.nosto(m/10); (b -> a) Transaktio 2: m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); (a -> b) 2012 OHJ-5010, Hajap, Kari Systä 8
Entä tämä? odottaa B varattu m:=a.saldo(); a.aseta(1.1*m); b.nosto(m/10); m:=b.saldo(); b.aseta(1.1*m); a.nosto(m/10); varattu A odottaa 2012 OHJ-5010, Hajap, Kari Systä 9
Erikseen luku- ja kirjoituslukot Rinnakkaisuus halutaan suureksi Granulariteetti mahdollisimman pieneksi Erikseen luku- ja kirjoituslukko Lukulukko voi olla jaettu Lukitussäännöt Jos transaktio A on lukenut resurssia R, niin rinnakkainen transaktio B ei saa kirjoittaa resurssiin ennen kuin A on lopettanut (kommit tai peruutus) Jos transaktio A on kirjoittanut resurssiin R, niin rinnakkainen transaktio B ei saa lukea eikä kirjoittaa resurssia ennen kuin A on lopettanut 2012 OHJ-5010, Hajap, Kari Systä 10
Lukkiumaesimerkki Transaktio T Transaktio U Operaatio Lukot Operaatio Lukot a.talleta(10) K(A) b.nosta(10) Odota K(B):tä U:lta b.talleta(20) K(B) a.nosta(20) Odota K(A):ta T:tä 2012 OHJ-5010, Hajap, Kari Systä 11
Lukot ja lukkiutumat - ratkaisuja Varataan transaktion alussa kaikki tarvittavat lukot Lukitaan muuttujat aina tietyssä järjestyksessä Johtaa liian aikaiseen lukitsemiseen ja vähentää rinnakkaisuutta lukkomanageri ylläpitää odotusgraafia Huomatessaan silmukan joku silmukan transaktioista perutaan timeout 2012 OHJ-5010, Hajap, Kari Systä 12
Optimistiset algoritmit Optimistiset algoritmit pyrkivät välttämään lukkojen ongelmat Idea: jos konfliktit ovat harvinaisia annetaan transaktioiden tehdä työnsä ja tarkastetaan lopuksi menikö kaikki hyvin 2012 OHJ-5010, Hajap, Kari Systä 13
Transaktiot aikaleimoilla: SDD-1 (system for distributed databases) Kirjoitukset tehdään alustavasti ja ne tulevat näkyviksi vasta closetransactionin jälkeen closetransaction johtaa aina kommittiin Jokaisesta oliosta on kommittoitu versio ja joukko alustavia versioita Jokaisella oliolla on kirjoitusaikaleima ja joukko lukuaikaleimoja (joita voi edustaa suurin) 2012 OHJ-5010, Hajap, Kari Systä 14
SDD-1 Kun kirjoitus hyväksytään, palvelin luo uuden alustavan olion kirjoittavan transaktion aikaleimalla Transaktion T lukuoperaatiot ohjataan siihen versioon oliosta, jonka kirjoitusaikaleima on suurin Transaktio T:n aikaleimaa pienemmistä versioista 2012 OHJ-5010, Hajap, Kari Systä 15
Esimerkki SSD1:llä Transaktio 1: 1: Start 3: m:=a.saldo(); 5: a.aseta(1.1*m); 7: b.nosto(m/10); Transaktio 2: 2: Start 4: m:=b.saldo(); 6: b.aseta(1.1*m); 8: a.nosto(m/10); 2012 OHJ-5010, Hajap, Kari Systä 16
Oletukset Alussa Molempien tilien saldo 100 ja aikaleima 0 T1 pyrkii siirtämään B->A ja T2 A->B Peräkkäiset suoritukset ovat T1;T2 (100,100)-> (110,90); (110,90) -> (101;99) T2;T1 (100,100) -> (90;110); (90;110) -> (99;101) 2012 OHJ-5010, Hajap, Kari Systä 17
Transaktio 1: 1: Start 3: m:=a.saldo(); 5: a.aseta(1.1*m); 100 (B.t = 0) 7: b.nosto(m/10); Esimerkki SSD1:llä T1:n aikaleima = 1 100 (A.t = 0) 110 (1 -> A.t) 90 (1 -> B.t ) Transaktio 2: 2: Start T2:n aikaleima = 2 100 (aikal. 0) 4: m:=b.saldo(); 110 (2 -> B.t) 6: b.aseta(1.1*m); 100 (A.t = 0) 8: a.nosto(m/10); 90 (2 -> A.t) 2012 OHJ-5010, Hajap, Kari Systä 18
Transaktiot aikaleimoilla Ei lukkiumia Aikaleimat ovat joskus herkkiä peruuttamaan 2012 OHJ-5010, Hajap, Kari Systä 19
Rinnakkaisuudenhallintatapojen vertailu Lukitukset ja aikaleimat pessimistisiä Sarjallisuusjärjestyksen määräytyminen Aikaleimat: transaktion alussa Lukot: suorituksen aikana Kun pääasiassa luetaan, niin aikaleimat parempia Jos sekä luetaan, että kirjoitetaan, niin lukitukset parempia Jos ei tule konflikteja, niin optimisti on nopein 2012 OHJ-5010, Hajap, Kari Systä 20