L-InterSystems IRIS DBMS jappoġġja strutturi interessanti għall-ħażna tad-dejta - globali. Essenzjalment, dawn huma ċwievet f'diversi livelli b'diversi goodies addizzjonali fil-forma ta 'tranżazzjonijiet, funzjonijiet veloċi biex jaqsmu siġar tad-dejta, serraturi u l-lingwa ObjectScript tagħha stess.
Aqra aktar dwar globali fis-serje ta 'artikoli "Il-globali huma xwabel tat-teżor għall-ħażna tad-dejta":
Sirt interessat dwar kif it-tranżazzjonijiet huma implimentati fil-globals, liema karatteristiċi hemm. Wara kollox, din hija struttura kompletament differenti għall-ħażna tad-dejta mit-tabelli tas-soltu. Livell ferm aktar baxx.
Kif inhu magħruf mit-teorija tad-databases relazzjonali, implimentazzjoni tajba tat-tranżazzjonijiet trid tissodisfa r-rekwiżiti :
A - Atomika (atomiċità). Il-bidliet kollha li saru fit-tranżazzjoni jew xejn huma rreġistrati.
C - Konsistenza. Wara li titlesta tranżazzjoni, l-istat loġiku tad-database għandu jkun internament konsistenti. F'ħafna modi dan ir-rekwiżit jikkonċerna lill-programmatur, iżda fil-każ ta 'databases SQL tikkonċerna wkoll ċwievet barranin.
I - Iżola. Tranżazzjonijiet li jsiru b'mod parallel m'għandhomx jaffettwaw lil xulxin.
D - Durabbli. Wara t-tlestija b'suċċess ta 'tranżazzjoni, problemi f'livelli aktar baxxi (nuqqas ta' enerġija, pereżempju) m'għandhomx jaffettwaw id-dejta mibdula mit-tranżazzjoni.
Globals huma strutturi tad-dejta mhux relazzjonali. Kienu ddisinjati biex jimxu super fast fuq hardware limitat ħafna. Ejja nħarsu lejn l-implimentazzjoni ta 'tranżazzjonijiet fl-użu globali .
Biex jiġu appoġġjati t-tranżazzjonijiet fl-IRIS, jintużaw il-kmandi li ġejjin: , , .
1. Atomiċità
L-eħfef mod biex tiċċekkja hija l-atomiċità. Aħna niċċekkjaw mill-console tad-database.
Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMITImbagħad nikkonkludu:
Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)Nirċievu:
1 2 3Kollox sew. Atomiċità tinżamm: il-bidliet kollha huma rreġistrati.
Ejja nikkomplikaw il-kompitu, nintroduċu żball u naraw kif it-tranżazzjoni tiġi ffrankata, parzjalment jew xejn.
Ejja nerġgħu niċċekkjaw l-atomiċità:
Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3Imbagħad inwaqqfu bil-qawwa l-kontenitur, innieduh u naraw.
docker kill my-irisDan il-kmand huwa kważi ekwivalenti għal għeluq tal-forza, peress li jibgħat sinjal SIGKILL biex iwaqqaf il-proċess immedjatament.
Forsi t-tranżazzjoni ġiet salvata parzjalment?
WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)- Le, ma baqgħetx ħaj.
Ejja nippruvaw il-kmand ta' rollback:
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)Lanqas ma baqa’ ħaj.
2. Konsistenza
Peress li f'databases ibbażati fuq globali, iċ-ċwievet isiru wkoll fuq globali (ħalluni nfakkarkom li globali hija struttura ta 'livell aktar baxx għall-ħażna tad-dejta minn tabella relazzjonali), biex tissodisfa r-rekwiżit ta' konsistenza, trid tiġi inkluża bidla fiċ-ċavetta fl-istess transazzjoni bħal bidla fil-globali.
Pereżempju, għandna ^ persuna globali, li fiha naħżnu personalitajiet u nużaw it-TIN bħala ċavetta.
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...Sabiex ikollna tfittxija malajr bl-kunjom u l-isem, għamilna ċ-ċavetta ^index.
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1Sabiex id-database tkun konsistenti, irridu nżidu l-persona bħal din:
TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMITGħaldaqstant, meta nħassru rridu nużaw ukoll tranżazzjoni:
TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMITFi kliem ieħor, li tissodisfa r-rekwiżit ta 'konsistenza tistrieħ kompletament fuq l-ispallejn tal-programmatur. Iżda meta niġu għall-globals, dan huwa normali, minħabba n-natura ta 'livell baxx tagħhom.
3. Iżolament
Dan huwa fejn il-wilds jibdew. Ħafna utenti jaħdmu fl-istess ħin fuq l-istess database, u jibdlu l-istess data.
Is-sitwazzjoni hija komparabbli ma 'meta ħafna utenti simultanjament jaħdmu bl-istess repożitorju tal-kodiċi u jippruvaw fl-istess ħin jikkommettu bidliet għal ħafna fajls f'daqqa.
Id-database għandha issolvi dan kollu f'ħin reali. Meta wieħed iqis li f'kumpaniji serji hemm anke persuna speċjali li hija responsabbli għall-kontroll tal-verżjoni (għall-għaqda tal-fergħat, is-soluzzjoni tal-kunflitti, eċċ.), U d-database trid tagħmel dan kollu f'ħin reali, il-kumplessità tal-kompitu u l-korrettezza tal- disinn tad-database u kodiċi li jserviha.
Id-database ma tistax tifhem it-tifsira tal-azzjonijiet imwettqa mill-utenti sabiex jiġu evitati kunflitti jekk ikunu qed jaħdmu fuq l-istess data. Hija tista 'biss tneħħa tranżazzjoni waħda li tkun f'kunflitt ma' oħra, jew tesegwixxihom b'mod sekwenzjali.
Problema oħra hija li waqt l-eżekuzzjoni ta 'tranżazzjoni (qabel impenn), l-istat tad-database jista' jkun inkonsistenti, għalhekk huwa mixtieq li tranżazzjonijiet oħra ma jkollhomx aċċess għall-istat inkonsistenti tad-database, li jinkiseb f'databases relazzjonali f'ħafna modi: ħolqien ta 'snapshots, ringieli b'diversi verżjonijiet u eċċ.
Meta tesegwixxi tranżazzjonijiet b'mod parallel, huwa importanti għalina li ma jinterferixxux ma 'xulxin. Din hija l-proprjetà ta 'iżolament.
SQL jiddefinixxi 4 livelli ta' iżolament:
- AQRA MHUX IMPENJATA
- AQRA IMPENJAT
- QARI RIPETIBBLI
- SERJALIZZABBLI
Ejja nħarsu lejn kull livell separatament. L-ispejjeż tal-implimentazzjoni ta' kull livell jikbru kważi b'mod esponenzjali.
AQRA MHUX IMPENJATA - dan huwa l-aktar livell baxx ta 'iżolament, iżda fl-istess ħin l-aktar mgħaġġel. It-tranżazzjonijiet jistgħu jaqraw bidliet magħmula minn xulxin.
AQRA IMPENJAT huwa l-livell li jmiss ta 'iżolament, li huwa kompromess. It-tranżazzjonijiet ma jistgħux jaqraw il-bidliet ta 'xulxin qabel il-kommit, iżda jistgħu jaqraw kwalunkwe tibdil li jkun sar wara l-kommit.
Jekk ikollna tranżazzjoni twila T1, li matulha seħħew impenji fit-tranżazzjonijiet T2, T3 ... Tn, li ħadmu bl-istess data bħal T1, allura meta nitolbu data f'T1 se nġibu riżultat differenti kull darba. Dan il-fenomenu jissejjaħ qari mhux ripetibbli.
QARI RIPETIBBLI — f'dan il-livell ta' iżolament m'għandniex il-fenomenu ta' qari mhux ripetibbli, minħabba l-fatt li għal kull talba biex taqra data, tinħoloq stampa tad-data tar-riżultat u meta terġa' tintuża fl-istess tranżazzjoni, id-data mill-istampa jintuża. Madankollu, huwa possibbli li taqra dejta fantażma f'dan il-livell ta 'iżolament. Dan jirreferi għall-qari ta' ringieli ġodda li ġew miżjuda minn transazzjonijiet kommessi paralleli.
SERJALIZZABBLI — l-ogħla livell ta’ insulazzjoni. Hija kkaratterizzata mill-fatt li d-dejta użata bi kwalunkwe mod fi tranżazzjoni (qari jew tibdil) issir disponibbli għal tranżazzjonijiet oħra biss wara t-tlestija tal-ewwel tranżazzjoni.
L-ewwel, ejja nsemmu jekk hemmx iżolament ta 'operazzjonijiet fi tranżazzjoni mill-ħajt prinċipali. Ejja niftħu 2 twieqi terminali.
Kill ^t
Write ^t(1)
2
TSTART
Set ^t(1)=2M'hemm l-ebda iżolament. Thread wieħed jara x'qed jagħmel it-tieni wieħed li fetaħ it-tranżazzjoni.
Ejja naraw jekk tranżazzjonijiet ta 'ħjut differenti jarawx x'inhu jiġri ġewwa fihom.
Ejja niftħu 2 twieqi terminali u niftħu 2 transazzjonijiet b'mod parallel.
kill ^t
TSTART
Write ^t(1)
3
TSTART
Set ^t(1)=3
Tranżazzjonijiet paralleli jaraw id-dejta ta 'xulxin. Allura, aħna ltqajna l-iktar livell ta 'iżolament sempliċi, iżda wkoll l-iktar mgħaġġel, AQRA MHUX IMPENJAT.
Fil-prinċipju, dan jista' jkun mistenni għal globali, li għalihom il-prestazzjoni dejjem kienet prijorità.
X'jiġri jekk għandna bżonn livell ogħla ta 'iżolament fl-operazzjonijiet fuq globali?
Hawnhekk trid taħseb għaliex il-livelli ta 'iżolament huma meħtieġa għal kollox u kif jaħdmu.
L-ogħla livell ta 'iżolament, SERIALIZE, ifisser li r-riżultat tat-tranżazzjonijiet esegwiti b'mod parallel huwa ekwivalenti għall-eżekuzzjoni sekwenzjali tagħhom, li tiggarantixxi n-nuqqas ta' ħabtiet.
Nistgħu nagħmlu dan billi tuża serraturi intelliġenti f'ObjectScript, li għandhom ħafna użi differenti: tista 'tagħmel qfil regolari, inkrementali, multiplu bil-kmand .
Livelli ta 'iżolament aktar baxxi huma kompromessi mfassla biex iżidu l-veloċità tad-database.
Ejja naraw kif nistgħu niksbu livelli differenti ta 'iżolament bl-użu ta' serraturi.
Dan l-operatur jippermettilek tieħu mhux biss serraturi esklussivi meħtieġa biex tibdel id-data, iżda l-hekk imsejħa serraturi kondiviżi, li jistgħu jieħdu diversi ħjut b'mod parallel meta jkollhom bżonn jaqraw data li m'għandhiex tinbidel minn proċessi oħra matul il-proċess tal-qari.
Aktar informazzjoni dwar il-metodu ta 'imblukkar b'żewġ fażijiet bir-Russu u l-Ingliż:
→
→
Id-diffikultà hija li waqt tranżazzjoni l-istat tad-database jista 'jkun inkonsistenti, iżda din id-data inkonsistenti hija viżibbli għal proċessi oħra. Kif tevita dan?
Bl-użu serraturi, se noħolqu twieqi ta 'viżibilità li fihom l-istat tad-database se jkun konsistenti. U l-aċċess kollu għal tali twieqi ta 'viżibilità ta' l-istat miftiehem se jkun ikkontrollat minn serraturi.
Serraturi kondiviżi fuq l-istess dejta jistgħu jerġgħu jintużaw—diversi proċessi jistgħu jeħduhom. Dawn is-serraturi jipprevjenu proċessi oħra milli jbiddlu d-dejta, i.e. huma użati biex jiffurmaw twieqi ta 'stat database konsistenti.
Serraturi esklussivi jintużaw għal bidliet fid-dejta - proċess wieħed biss jista 'jieħu tali serratura. Serratura esklussiva tista' tittieħed minn:
- Kwalunkwe proċess jekk id-data hija ħielsa
- Biss il-proċess li għandu lock kondiviż fuq din id-dejta u kien l-ewwel li talab lock esklussiv.

Iktar ma tkun dejqa t-tieqa tal-viżibilità, aktar proċessi oħra jridu jistennewha, iżda iktar ikun konsistenti l-istat tad-database fi ħdanha.
READ_COMMITTED — l-essenza ta 'dan il-livell hija li naraw biss data kommessa minn ħjut oħra. Jekk id-dejta fi tranżazzjoni oħra għadha ma ġietx impenjata, allura naraw il-verżjoni l-antika tagħha.
Dan jippermettilna li nipparalleljaw ix-xogħol minflok ma nistennew li l-lock jiġi rilaxxat.
Mingħajr tricks speċjali, ma nkunux nistgħu naraw il-verżjoni l-qadima tad-dejta fl-IRIS, għalhekk ikollna naqbdu mas-serraturi.
Għaldaqstant, ikollna nużaw serraturi kondiviżi biex inħallu d-dejta tinqara biss f'mumenti ta 'konsistenza.
Ejja ngħidu li għandna bażi ta' utenti ^persuna li tittrasferixxi flus lil xulxin.
Il-mument tat-trasferiment minn persuna 123 għal persuna 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)Il-mument li jintalab l-ammont ta' flus mingħand il-persuna 123 qabel id-debitu għandu jkun akkumpanjat minn blokk esklussiv (b'mod awtomatiku):
LOCK +^person(123)
Write ^person(123)U jekk għandek bżonn turi l-istatus tal-kont fil-kont personali tiegħek, allura tista 'tuża serratura kondiviża jew ma tużah xejn:
LOCK +^person(123)#”S”
Write ^person(123)Madankollu, jekk nassumu li l-operazzjonijiet tad-database jitwettqu kważi istantanjament (ħalluni nfakkarkom li l-globals huma struttura ta 'livell ħafna aktar baxx minn tabella relazzjonali), allura l-ħtieġa għal dan il-livell tonqos.
QARI RIPETIBBLI - Dan il-livell ta 'iżolament jippermetti qari multipli ta' data li jistgħu jiġu modifikati minn tranżazzjonijiet konkorrenti.
Għaldaqstant, ser ikollna npoġġu lock kondiviż fuq il-qari tad-dejta li nibdlu u serraturi esklussivi fuq id-dejta li nibdlu.
Fortunatament, l-operatur LOCK jippermettilek telenka fid-dettall is-serraturi kollha meħtieġa, li minnhom jista 'jkun hemm ħafna, f'dikjarazzjoni waħda.
LOCK +^person(123, amount)#”S”
чтение ^person(123, amount)operazzjonijiet oħra (f'dan il-ħin ħjut paralleli jippruvaw ibiddlu ^person(123, ammont), iżda ma jistgħux)
LOCK +^person(123, amount)
изменение ^person(123, amount)
LOCK -^person(123, amount)
чтение ^person(123, amount)
LOCK -^person(123, amount)#”S”Meta telenka serraturi separati b'virgoli, jittieħdu b'mod sekwenzjali, imma jekk tagħmel dan:
LOCK +(^person(123),^person(242))imbagħad jittieħdu atomikament kollha f'daqqa.
SERJALIZZA — ser ikollna nissettjaw serraturi sabiex fl-aħħar mill-aħħar it-tranżazzjonijiet kollha li għandhom data komuni jiġu eżegwiti b'mod sekwenzjali. Għal dan l-approċċ, il-biċċa l-kbira tas-serraturi għandhom ikunu esklussivi u meħuda fuq l-iżgħar żoni tad-dinja għall-prestazzjoni.
Jekk nitkellmu dwar id-debitu ta 'fondi fil-^persuna globali, allura l-livell ta' iżolament SERIALIZE biss huwa aċċettabbli għalih, peress li l-flus għandhom jintefqu b'mod strett b'mod sekwenzjali, inkella huwa possibbli li tonfoq l-istess ammont diversi drabi.
4. Durabilità
Jien wettaqt testijiet bi qtugħ iebes tal-kontenitur bl-użu
docker kill my-irisIl-bażi ittollerathom tajjeb. Ma ġew identifikati l-ebda problemi.
Konklużjoni
Għal globali, InterSystems IRIS għandha appoġġ għat-tranżazzjonijiet. Huma tassew atomiċi u affidabbli. Biex tiġi żgurata l-konsistenza ta 'database bbażata fuq globali, huma meħtieġa sforzi tal-programmatur u l-użu ta' tranżazzjonijiet, peress li m'għandux kostruzzjonijiet kumplessi integrati bħal ċwievet barranin.
Il-livell ta 'iżolament tal-globals mingħajr l-użu ta' serraturi huwa AQRA MHUX IMPENJAT, u meta tuża serraturi jista 'jiġi żgurat sal-livell SERIALIZE.
Il-korrettezza u l-veloċità tat-tranżazzjonijiet fuq globali tiddependi ħafna fuq il-ħila tal-programmatur: aktar ma jintużaw serraturi kondiviżi b'mod wiesa 'fil-qari, iktar ikun għoli l-livell ta' iżolament, u aktar ma jittieħdu s-serraturi esklussivi, iktar ikun mgħaġġel il-prestazzjoni.
Sors: www.habr.com
