Tranżazzjonijiet f'InterSystems IRIS globali

Tranżazzjonijiet f'InterSystems IRIS globaliL-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":

Siġar. Parti 1
Siġar. Parti 2
Arrays skarsi. Parti 3

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 ACID:

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 immaġni uffiċjali tal-IRIS docker.

Biex jiġu appoġġjati t-tranżazzjonijiet fl-IRIS, jintużaw il-kmandi li ġejjin: TSTART, TIMPENJA, TROLLBACK.

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
TCOMMIT

Imbagħad nikkonkludu:

Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)

Nirċievu:

1 2 3

Kollox 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) = 3

Imbagħad inwaqqfu bil-qawwa l-kontenitur, innieduh u naraw.

docker kill my-iris

Dan 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) = 1

Sabiex 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
TCOMMIT

Għaldaqstant, meta nħassru rridu nużaw ukoll tranżazzjoni:

TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMIT

Fi 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)=2

M'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 LOCK.

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ż:

Imblukkar b'żewġ fażijiet
Qfil b'żewġ fażijiet

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:

  1. Kwalunkwe proċess jekk id-data hija ħielsa
  2. Biss il-proċess li għandu lock kondiviż fuq din id-dejta u kien l-ewwel li talab lock esklussiv.

Tranżazzjonijiet f'InterSystems IRIS globali

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-iris

Il-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

Żid kumment