InterSystems IRIS DBVS atbalsta interesantas datu glabÄÅ”anas struktÅ«ras - globÄlos. BÅ«tÄ«bÄ tÄs ir daudzlÄ«meÅu atslÄgas ar dažÄdiem papildu labumiem transakciju veidÄ, ÄtrÄm funkcijÄm datu koku ŔķÄrsoÅ”anai, slÄdzenes un savu ObjectScript valodu.
VairÄk par globÄliem lasiet rakstu sÄrijÄ āGlobÄli ir dÄrgumu zobeni datu glabÄÅ”anaiā:
SÄku interesÄties, kÄ globalos tiek realizÄti darÄ«jumi, kÄdas tur ir iespÄjas. Galu galÄ Å”Ä« ir pilnÄ«gi atŔķirÄ«ga datu glabÄÅ”anas struktÅ«ra nekÄ parastÄs tabulas. Daudz zemÄks lÄ«menis.
KÄ zinÄms no relÄciju datu bÄzu teorijas, labai transakciju ievieÅ”anai ir jÄatbilst prasÄ«bÄm
A - Atomiskais (atomiskums). Tiek reÄ£istrÄtas visas darÄ«jumÄ veiktÄs izmaiÅas vai tÄs nav vispÄr.
C ā konsekvence. PÄc darÄ«juma pabeigÅ”anas datu bÄzes loÄ£iskajam stÄvoklim jÄbÅ«t iekÅ”Äji konsekventam. DaudzÄjÄdÄ ziÅÄ Å”Ä« prasÄ«ba attiecas uz programmÄtÄju, bet SQL datu bÄzu gadÄ«jumÄ tÄ attiecas arÄ« uz ÄrÄjÄm atslÄgÄm.
Es - IzolÄt. ParalÄli veiktie darÄ«jumi nedrÄ«kst ietekmÄt viens otru.
D - IzturÄ«gs. PÄc veiksmÄ«gas darÄ«juma pabeigÅ”anas problÄmÄm zemÄkos lÄ«meÅos (piemÄram, strÄvas padeves pÄrtraukums) nevajadzÄtu ietekmÄt datus, kas mainÄ«ti darÄ«juma rezultÄtÄ.
GlobÄlie ir nerelÄciju datu struktÅ«ras. Tie tika izstrÄdÄti, lai darbotos Ä«paÅ”i Ätri ar ļoti ierobežotu aparatÅ«ru. ApskatÄ«sim transakciju ievieÅ”anu globalos, izmantojot
Lai atbalstÄ«tu darÄ«jumus IRIS, tiek izmantotas Å”Ädas komandas:
1. Atomiskums
VienkÄrÅ”Äkais veids, kÄ pÄrbaudÄ«t atomitÄti. MÄs pÄrbaudÄm no datu bÄzes konsoles.
Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMIT
Tad mÄs secinÄm:
Write ^a(1), ā ā, ^a(2), ā ā, ^a(3)
MÄs iegÅ«stam:
1 2 3
Viss ir kÄrtÄ«bÄ. Atomiskums tiek saglabÄts: visas izmaiÅas tiek reÄ£istrÄtas.
Sarežģīsim uzdevumu, ievadÄ«sim kļūdu un redzÄsim, kÄ darÄ«jums tiek saglabÄts daļÄji vai vispÄr netiek saglabÄts.
VÄlreiz pÄrbaudÄ«sim atomitÄti:
Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
Tad mÄs ar spÄku apturÄsim konteineru, palaidÄ«sim to un redzÄsim.
docker kill my-iris
Å Ä« komanda ir gandrÄ«z lÄ«dzvÄrtÄ«ga piespiedu izslÄgÅ”anai, jo tÄ nosÅ«ta SIGKILL signÄlu, lai nekavÄjoties apturÄtu procesu.
VarbÅ«t darÄ«jums tika daļÄji saglabÄts?
WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)
- NÄ, tas nav izdzÄ«vojis.
IzmÄÄ£inÄsim atgrieÅ”anas komandu:
Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TROLLBACK
WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)
ArÄ« nekas nav saglabÄjies.
2. Konsekvence
TÄ kÄ datu bÄzÄs, kuru pamatÄ ir globÄlÄs vÄrtÄ«bas, atslÄgas tiek veidotas arÄ« uz globÄlajÄm (atgÄdinÄÅ”u, ka globÄlÄ ir zemÄka lÄ«meÅa struktÅ«ra datu glabÄÅ”anai nekÄ relÄciju tabula), lai izpildÄ«tu konsekvences prasÄ«bu, ir jÄiekļauj atslÄgas izmaiÅas. tajÄ paÅ”Ä darÄ«jumÄ kÄ izmaiÅas globÄlajÄ.
PiemÄram, mums ir globÄla ^persona, kurÄ mÄs glabÄjam personÄ«bas un kÄ atslÄgu izmantojam TIN.
^person(1234567, āfirstnameā) = āSergeyā
^person(1234567, ālastnameā) = āKamenevā
^person(1234567, āphoneā) = ā+74995555555
...
Lai Ätri meklÄtu pÄc uzvÄrda un vÄrda, mÄs izveidojÄm taustiÅu ^index.
^index(āKamenevā, āSergeyā, 1234567) = 1
Lai datu bÄze bÅ«tu konsekventa, persona jÄpievieno Å”Ädi:
TSTART
^person(1234567, āfirstnameā) = āSergeyā
^person(1234567, ālastnameā) = āKamenevā
^person(1234567, āphoneā) = ā+74995555555
^index(āKamenevā, āSergeyā, 1234567) = 1
TCOMMIT
AttiecÄ«gi, dzÄÅ”ot, mums ir jÄizmanto arÄ« darÄ«jums:
TSTART
Kill ^person(1234567)
ZKill ^index(āKamenevā, āSergeyā, 1234567)
TCOMMIT
Citiem vÄrdiem sakot, konsekvences prasÄ«bas izpilde pilnÄ«bÄ gulstas uz programmÄtÄja pleciem. Bet, runÄjot par globÄlajiem, tas ir normÄli to zemÄ lÄ«meÅa dÄļ.
3. IzolÄcija
Å eit sÄkas savvaļas dabas. Daudzi lietotÄji vienlaikus strÄdÄ pie vienas datu bÄzes, mainot vienus un tos paÅ”us datus.
SituÄcija ir salÄ«dzinÄma ar situÄciju, kad daudzi lietotÄji vienlaikus strÄdÄ ar vienu un to paÅ”u kodu krÄtuvi un mÄÄ£ina vienlaikus veikt izmaiÅas daudzos failos vienlaikus.
DatubÄzei tas viss ir jÄsakÄrto reÄllaikÄ. Å emot vÄrÄ, ka nopietnos uzÅÄmumos ir pat Ä«paÅ”s cilvÄks, kas atbild par versiju kontroli (par filiÄļu apvienoÅ”anu, konfliktu risinÄÅ”anu u.c.), un datu bÄzei tas viss jÄdara reÄllaikÄ, uzdevuma sarežģītÄ«ba un pareizÄ«ba. datu bÄzes dizains un kods, kas to apkalpo.
DatubÄze nevar saprast lietotÄju veikto darbÄ«bu nozÄ«mi, lai izvairÄ«tos no konfliktiem, ja viÅi strÄdÄ ar tiem paÅ”iem datiem. Tas var atsaukt tikai vienu darÄ«jumu, kas ir pretrunÄ ar citu, vai izpildÄ«t tos secÄ«gi.
ProblÄma ir arÄ« tÄ, ka darÄ«juma izpildes laikÄ (pirms commit) datu bÄzes stÄvoklis var bÅ«t nekonsekvents, tÄpÄc vÄlams, lai citiem darÄ«jumiem nebÅ«tu pieejams datu bÄzes nekonsekventais stÄvoklis, kas tiek panÄkts relÄciju datu bÄzÄs. daudzos veidos: veidojot momentuzÅÄmumus, vairÄkas versijas rindas utt.
Veicot darÄ«jumus paralÄli, mums ir svarÄ«gi, lai tie netraucÄtu viens otram. Å Ä« ir izolÄcijas Ä«paŔība.
SQL definÄ 4 izolÄcijas lÄ«meÅus:
- LASI NEKÄRTOTI
- LASÄŖT SAISTÄŖTU
- ATKÄRTOTI LASÄŖJUMS
- SERIALIZÄJAMS
ApskatÄ«sim katru lÄ«meni atseviŔķi. Katra lÄ«meÅa ievieÅ”anas izmaksas pieaug gandrÄ«z eksponenciÄli.
LASI NEKÄRTOTI - tas ir zemÄkais izolÄcijas lÄ«menis, bet tajÄ paÅ”Ä laikÄ ÄtrÄkais. DarÄ«jumos var lasÄ«t viens otra veiktÄs izmaiÅas.
LASÄŖT SAISTÄŖTU ir nÄkamais izolÄcijas lÄ«menis, kas ir kompromiss. DarÄ«jumi nevar nolasÄ«t viens otra izmaiÅas pirms saistÄ«bu izpildes, taÄu tÄs var lasÄ«t visas izmaiÅas, kas veiktas pÄc saistÄ«bu izpildes.
Ja mums ir ilgs darÄ«jums T1, kura laikÄ notika commits darÄ«jumos T2, T3 ... Tn, kas strÄdÄja ar tiem paÅ”iem datiem kÄ T1, tad pieprasot datus T1, mÄs katru reizi iegÅ«sim citu rezultÄtu. Å o parÄdÄ«bu sauc par neatkÄrtojamu lasÄ«Å”anu.
ATKÄRTOTI LASÄŖJUMS ā Å”ajÄ izolÄcijas lÄ«menÄ« mums nav neatkÄrtojamas nolasÄ«Å”anas fenomena, jo katram datu nolasÄ«Å”anas pieprasÄ«jumam tiek izveidots rezultÄta datu momentuzÅÄmums un, atkÄrtoti izmantojot tajÄ paÅ”Ä darÄ«jumÄ, momentuzÅÄmuma dati. tiek izmantots. TomÄr Å”ajÄ izolÄcijas lÄ«menÄ« ir iespÄjams nolasÄ«t fantoma datus. Tas attiecas uz jaunu rindu nolasÄ«Å”anu, kas tika pievienotas paralÄli veikto darÄ«jumu rezultÄtÄ.
SERIALIZÄJAMS ā visaugstÄkais izolÄcijas lÄ«menis. To raksturo fakts, ka dati, kas jebkÄdÄ veidÄ tiek izmantoti darÄ«jumÄ (nolasot vai mainot), kļūst pieejami citiem darÄ«jumiem tikai pÄc pirmÄ darÄ«juma pabeigÅ”anas.
Vispirms noskaidrosim, vai darÄ«juma operÄcijas ir izolÄtas no galvenÄ pavediena. AtvÄrsim 2 terminÄļa logus.
Kill ^t
Write ^t(1)
2
TSTART
Set ^t(1)=2
Nav izolÄcijas. Viens pavediens redz, ko dara otrs, kurÅ” atvÄra darÄ«jumu.
PaskatÄ«simies, vai dažÄdu pavedienu darÄ«jumi redz, kas notiek tajos.
AtvÄrsim 2 terminÄļa logus un paralÄli atvÄrsim 2 darÄ«jumus.
kill ^t
TSTART
Write ^t(1)
3
TSTART
Set ^t(1)=3
ParalÄli darÄ«jumi redz viens otra datus. TÄtad, mÄs ieguvÄm vienkÄrÅ”Äko, bet arÄ« ÄtrÄko izolÄcijas lÄ«meni, READ UNCOMMITED.
PrincipÄ to varÄtu sagaidÄ«t globÄlajiem uzÅÄmumiem, kuriem sniegums vienmÄr ir bijis prioritÄte.
Ko darÄ«t, ja mums ir nepiecieÅ”ams augstÄks izolÄcijas lÄ«menis operÄcijÄs ar globÄlajiem objektiem?
Å eit jums ir jÄdomÄ par to, kÄpÄc izolÄcijas lÄ«meÅi vispÄr ir nepiecieÅ”ami un kÄ tie darbojas.
AugstÄkais izolÄcijas lÄ«menis SERIALIZE nozÄ«mÄ, ka paralÄli veikto darÄ«jumu rezultÄts ir lÄ«dzvÄrtÄ«gs to secÄ«gajai izpildei, kas garantÄ sadursmju neesamÄ«bu.
MÄs to varam izdarÄ«t, izmantojot viedÄs slÄdzenes ObjectScript, kurÄm ir daudz dažÄdu lietojumu: jÅ«s varat veikt regulÄru, pakÄpenisku, vairÄku bloÄ·ÄÅ”anu ar komandu
ZemÄks izolÄcijas lÄ«menis ir kompromiss, kas paredzÄts datu bÄzes Ätruma palielinÄÅ”anai.
ApskatÄ«sim, kÄ mÄs varam sasniegt dažÄdus izolÄcijas lÄ«meÅus, izmantojot slÄdzenes.
Å is operators ļauj paÅemt ne tikai ekskluzÄ«vas datu maiÅai nepiecieÅ”amÄs slÄdzenes, bet arÄ« tÄ sauktÄs koplietotÄs slÄdzenes, kas paralÄli var aizÅemt vairÄkus pavedienus, kad tiem nepiecieÅ”ams nolasÄ«t datus, kurus lasÄ«Å”anas procesÄ nevajadzÄtu mainÄ«t citiem procesiem.
PlaÅ”Äka informÄcija par divfÄžu bloÄ·ÄÅ”anas metodi krievu un angļu valodÄ:
ā
ā
GrÅ«tÄ«bas ir tÄdas, ka darÄ«juma laikÄ datu bÄzes stÄvoklis var bÅ«t nekonsekvents, bet Å”ie nekonsekventie dati ir redzami citiem procesiem. KÄ no tÄ izvairÄ«ties?
Izmantojot slÄdzenes, mÄs izveidosim redzamÄ«bas logus, kuros datu bÄzes stÄvoklis bÅ«s konsekvents. Un visa pieeja Å”Ädiem norunÄtÄ stÄvokļa redzamÄ«bas logiem tiks kontrolÄta ar slÄdzenÄm.
Vienu un to paÅ”u datu koplietotÄs slÄdzenes ir atkÄrtoti izmantojamas ā tos var izmantot vairÄki procesi. Å Ä«s slÄdzenes neļauj citiem procesiem mainÄ«t datus, t.i. tos izmanto konsekventa datu bÄzes stÄvokļa logu veidoÅ”anai.
Datu izmaiÅÄm tiek izmantotas ekskluzÄ«vas slÄdzenes ā Å”Ädu bloÄ·ÄÅ”anu var veikt tikai viens process. EkskluzÄ«vu slÄdzeni var paÅemt:
- JebkurÅ” process, ja dati ir bezmaksas
- Tikai process, kuram ir koplietota bloÄ·ÄÅ”ana Å”iem datiem un kurÅ” pirmais pieprasÄ«ja ekskluzÄ«vu bloÄ·ÄÅ”anu.
Jo Å”aurÄks ir redzamÄ«bas logs, jo ilgÄk citiem procesiem tas jÄgaida, bet jo konsekventÄks var bÅ«t datu bÄzes stÄvoklis tajÄ.
READ_COMMITTED ā Ŕī lÄ«meÅa bÅ«tÄ«ba ir tÄda, ka mÄs redzam tikai iegÅ«tos datus no citiem pavedieniem. Ja dati citÄ darÄ«jumÄ vÄl nav piesaistÄ«ti, mÄs redzam tÄ veco versiju.
Tas ļauj mums paralÄli veikt darbu, nevis gaidÄ«t slÄdzenes atbrÄ«voÅ”anu.
Bez Ä«paÅ”iem trikiem IRIS nevarÄsim redzÄt veco datu versiju, tÄpÄc nÄksies iztikt ar slÄdzenÄm.
AttiecÄ«gi mums bÅ«s jÄizmanto koplietotÄs bloÄ·ÄÅ”anas, lai datus varÄtu nolasÄ«t tikai konsekvences brīžos.
PieÅemsim, ka mums ir lietotÄju bÄze ^persona, kas pÄrskaita naudu viens otram.
PÄrejas brÄ«dis no personas 123 uz personu 242:
LOCK +^person(123), +^person(242)
Set ^person(123, amount) = ^person(123, amount) - amount
Set ^person(242, amount) = ^person(242, amount) + amount
LOCK -^person(123), -^person(242)
Naudas summas pieprasÄ«Å”anas brÄ«dim no personas 123 pirms norakstÄ«Å”anas jÄpievieno ekskluzÄ«vs bloks (pÄc noklusÄjuma):
LOCK +^person(123)
Write ^person(123)
Un, ja jums ir jÄparÄda konta statuss savÄ personÄ«gajÄ kontÄ, varat izmantot koplietojamo slÄdzeni vai to neizmantot vispÄr:
LOCK +^person(123)#āSā
Write ^person(123)
TaÄu, ja pieÅemam, ka datubÄzes darbÄ«bas tiek veiktas gandrÄ«z acumirklÄ« (atgÄdinÄÅ”u, ka globÄlie ir daudz zemÄka lÄ«meÅa struktÅ«ra nekÄ relÄciju tabula), tad nepiecieÅ”amÄ«ba pÄc Ŕī lÄ«meÅa samazinÄs.
ATKÄRTOTI LASÄŖJUMS - Å is izolÄcijas lÄ«menis ļauj vairÄkkÄrt nolasÄ«t datus, kurus var mainÄ«t, veicot vienlaikus darÄ«jumus.
AttiecÄ«gi mums bÅ«s jÄbloÄ·Ä mainÄ«to datu lasÄ«Å”ana un ekskluzÄ«vas bloÄ·ÄÅ”anas iespÄjas datiem, kurus mÄs mainÄm.
Par laimi, LOCK operators ļauj detalizÄti uzskaitÄ«t visas nepiecieÅ”amÄs slÄdzenes, kuru var bÅ«t ļoti daudz, vienÄ paziÅojumÄ.
LOCK +^person(123, amount)#āSā
ŃŃŠµŠ½ŠøŠµ ^person(123, amount)
citas darbÄ«bas (Å”obrÄ«d paralÄlie pavedieni mÄÄ£ina mainÄ«t ^person(123, summa), bet nevar)
LOCK +^person(123, amount)
ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŠµ ^person(123, amount)
LOCK -^person(123, amount)
ŃŃŠµŠ½ŠøŠµ ^person(123, amount)
LOCK -^person(123, amount)#āSā
Uzskaitot slÄdzenes, kas atdalÄ«tas ar komatiem, tÄs tiek Åemtas secÄ«gi, bet, ja to darÄt:
LOCK +(^person(123),^person(242))
tad tos Åem atomiski visus uzreiz.
SERIALIZÄT ā mums bÅ«s jÄiestata bloÄ·ÄÅ”ana, lai galu galÄ visas transakcijas, kurÄm ir kopÄ«gi dati, tiktu izpildÄ«tas secÄ«gi. Lai izmantotu Å”o pieeju, lielÄkajai daļai slÄdzeÅu ir jÄbÅ«t ekskluzÄ«vÄm un veiktspÄjas nodroÅ”inÄÅ”anai tÄs jÄizmanto vismazÄkajÄs pasaules vietÄs.
Ja runÄjam par lÄ«dzekļu norakstÄ«Å”anu globÄlajÄ cilvÄkÄ, tad tam ir pieÅemams tikai SERIALIZE izolÄcijas lÄ«menis, jo nauda jÄtÄrÄ stingri secÄ«gi, pretÄjÄ gadÄ«jumÄ vienu un to paÅ”u summu iespÄjams iztÄrÄt vairÄkas reizes.
4. Izturība
Es veicu testus ar cietu konteinera grieŔanu, izmantojot
docker kill my-iris
BÄze tos labi panesa. ProblÄmas netika konstatÄtas.
SecinÄjums
GlobÄlajiem klientiem InterSystems IRIS ir transakciju atbalsts. Tie ir patiesi atomiski un uzticami. Lai nodroÅ”inÄtu uz globÄliem datiem balstÄ«tas datubÄzes konsekvenci, ir nepiecieÅ”amas programmÄtÄja pÅ«les un transakciju izmantoÅ”ana, jo tai nav sarežģītu iebÅ«vÄtu konstrukciju, piemÄram, ÄrÄjÄs atslÄgas.
GlobÄlu izolÄcijas lÄ«menis, neizmantojot slÄdzenes, ir READ UNCOMMITED, un, izmantojot slÄdzenes, to var nodroÅ”inÄt lÄ«dz SERIALIZE lÄ«menim.
GlobÄlos transakciju pareizÄ«ba un Ätrums lielÄ mÄrÄ ir atkarÄ«gs no programmÄtÄja prasmes: jo plaÅ”Äk tiek izmantotas lasÄ«Å”anas laikÄ koplietotÄs slÄdzenes, jo augstÄks ir izolÄcijas lÄ«menis un jo Å”aurÄk tiek Åemtas ekskluzÄ«vas slÄdzenes, jo ÄtrÄka ir veiktspÄja.
Avots: www.habr.com