Shughuli katika InterSystems IRIS globals

Shughuli katika InterSystems IRIS globalsInterSystems IRIS DBMS inasaidia miundo ya kuvutia ya kuhifadhi data - globals. Kimsingi, hizi ni funguo za viwango vingi zilizo na vitu vingi vya ziada katika mfumo wa miamala, utendaji wa haraka wa kupitisha miti ya data, kufuli na lugha yake ya ObjectScript.

Soma zaidi kuhusu ulimwengu katika mfululizo wa makala "Globals ni hazina ya kuhifadhi data":

Miti. Sehemu 1
Miti. Sehemu 2
Safu chache. Sehemu ya 3

Nilivutiwa na jinsi shughuli zinavyotekelezwa katika ulimwengu, kuna vipengele gani. Baada ya yote, hii ni muundo tofauti kabisa wa kuhifadhi data kuliko meza za kawaida. Kiwango cha chini sana.

Kama inavyojulikana kutoka kwa nadharia ya hifadhidata za uhusiano, utekelezaji mzuri wa miamala lazima ukidhi mahitaji. ACID:

A - Atomiki (atomiki). Mabadiliko yote yaliyofanywa katika muamala au hakuna kabisa yanarekodiwa.

C - Uthabiti. Baada ya muamala kukamilika, hali ya kimantiki ya hifadhidata lazima iwe sawa ndani. Kwa njia nyingi hitaji hili linahusu programu, lakini katika kesi ya hifadhidata za SQL pia inahusu funguo za kigeni.

Mimi - Kujitenga. Miamala inayoendeshwa sambamba haipaswi kuathiri kila mmoja.

D - Inadumu. Baada ya kukamilika kwa shughuli kwa mafanikio, matatizo katika viwango vya chini (kushindwa kwa nguvu, kwa mfano) haipaswi kuathiri data iliyobadilishwa na shughuli.

Ulimwengu ni miundo ya data isiyo na uhusiano. Ziliundwa ili kukimbia haraka sana kwenye maunzi machache sana. Wacha tuangalie utekelezaji wa miamala katika matumizi ya ulimwengu picha rasmi ya IRIS docker.

Ili kusaidia shughuli katika IRIS, amri zifuatazo hutumiwa: TSTART, TCOMMIT, TROLLBACK.

1. Atomia

Njia rahisi ya kuangalia ni atomicity. Tunaangalia kutoka kwa koni ya hifadhidata.

Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMIT

Kisha tunahitimisha:

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

Tunapata:

1 2 3

Kila kitu kiko sawa. Atomicity inadumishwa: mabadiliko yote yanarekodiwa.

Wacha tufanye kazi ngumu, anzisha hitilafu na uone jinsi shughuli inavyohifadhiwa, kwa sehemu au la.

Wacha tuangalie tena atomiki:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3

Kisha tutasimamisha chombo kwa nguvu, kuzindua na kuona.

docker kill my-iris

Amri hii inakaribia kuwa sawa na kuzima kwa nguvu, kwani hutuma ishara ya SIGKILL kusimamisha mchakato mara moja.

Labda muamala ulihifadhiwa kwa kiasi?

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

- Hapana, haijaokoka.

Wacha tujaribu amri ya kurudi nyuma:

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)

Hakuna kitu ambacho kimeokoka pia.

2. Uthabiti

Kwa kuwa katika hifadhidata kulingana na ulimwengu, funguo pia hufanywa kwa ulimwengu (wacha nikukumbushe kuwa ulimwengu ni muundo wa kiwango cha chini cha kuhifadhi data kuliko jedwali la uhusiano), ili kukidhi mahitaji ya uthabiti, mabadiliko katika ufunguo lazima yajumuishwe. katika shughuli sawa na mabadiliko katika ulimwengu.

Kwa mfano, tuna ^mtu wa kimataifa, ambamo tunahifadhi watu binafsi na tunatumia TIN kama ufunguo.

^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...

Ili kuwa na utafutaji wa haraka kwa jina la mwisho na jina la kwanza, tulitengeneza ^index key.

^index(‘Kamenev’, ‘Sergey’, 1234567) = 1

Ili hifadhidata iwe thabiti, lazima tuongeze mtu kama hii:

TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMIT

Ipasavyo, wakati wa kufuta lazima pia tutumie shughuli:

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

Kwa maneno mengine, kutimiza hitaji la uthabiti hutegemea kabisa mabega ya mtayarishaji programu. Lakini linapokuja suala la ulimwengu, hii ni kawaida, kwa sababu ya asili yao ya kiwango cha chini.

3. Kutengwa

Hapa ndipo pori huanza. Watumiaji wengi wakati huo huo hufanya kazi kwenye hifadhidata moja, kubadilisha data sawa.

Hali hiyo inalinganishwa na wakati watumiaji wengi wanafanya kazi wakati huo huo na hazina sawa ya msimbo na kujaribu kufanya mabadiliko kwa faili nyingi kwa wakati mmoja.

Hifadhidata inapaswa kusuluhisha yote kwa wakati halisi. Kwa kuzingatia kwamba katika makampuni makubwa kuna hata mtu maalum ambaye anajibika kwa udhibiti wa toleo (kwa kuunganisha matawi, kutatua migogoro, nk), na database lazima ifanye yote haya kwa wakati halisi, ugumu wa kazi na usahihi wa kazi. muundo wa hifadhidata na msimbo unaoitumikia.

Hifadhidata haiwezi kuelewa maana ya vitendo vinavyofanywa na watumiaji ili kuzuia mizozo ikiwa wanafanyia kazi data sawa. Inaweza kutendua tu muamala mmoja unaokinzana na mwingine, au kuutekeleza kwa kufuatana.

Shida nyingine ni kwamba wakati wa utekelezaji wa shughuli (kabla ya ahadi), hali ya hifadhidata inaweza kuwa haiendani, kwa hivyo ni muhimu kwamba shughuli zingine hazina ufikiaji wa hali ya kutofautiana ya hifadhidata, ambayo inafanikiwa katika hifadhidata za uhusiano. kwa njia nyingi: kuunda snapshots, safu nyingi za matoleo na nk.

Wakati wa kutekeleza shughuli kwa sambamba, ni muhimu kwetu kwamba wasiingiliane. Hii ni mali ya kujitenga.

SQL inafafanua viwango 4 vya kutengwa:

  • SOMA BILA KUJITUMA
  • SOMA UMEJITOA
  • INAYORUDIWA KUSOMA
  • SERIALIZABLE

Wacha tuangalie kila ngazi tofauti. Gharama za kutekeleza kila ngazi zinakua karibu kwa kasi.

SOMA BILA KUJITUMA - hii ni kiwango cha chini cha kutengwa, lakini wakati huo huo kwa kasi zaidi. Shughuli za malipo zinaweza kusoma mabadiliko yaliyofanywa na kila mmoja.

SOMA UMEJITOA ni ngazi inayofuata ya kutengwa, ambayo ni maelewano. Shughuli za malipo haziwezi kusoma mabadiliko ya kila mmoja kabla ya ahadi, lakini zinaweza kusoma mabadiliko yoyote yaliyofanywa baada ya ahadi.

Ikiwa tuna shughuli ndefu T1, wakati ambapo ahadi zilifanyika katika shughuli T2, T3 ... Tn, ambayo ilifanya kazi na data sawa na T1, basi wakati wa kuomba data katika T1 tutapata matokeo tofauti kila wakati. Jambo hili linaitwa usomaji usiorudiwa.

INAYORUDIWA KUSOMA - katika kiwango hiki cha kutengwa hatuna hali ya usomaji usioweza kurudiwa, kwa sababu kwa kila ombi la kusoma data, muhtasari wa data ya matokeo huundwa na inapotumiwa tena katika shughuli hiyo hiyo, data kutoka kwa muhtasari. hutumika. Walakini, inawezekana kusoma data ya phantom katika kiwango hiki cha kutengwa. Hii inarejelea kusoma safu mlalo mpya ambazo ziliongezwa na miamala iliyofanywa sambamba.

SERIALIZABLE - kiwango cha juu cha insulation. Inajulikana na ukweli kwamba data iliyotumiwa kwa njia yoyote katika shughuli (kusoma au kubadilisha) inapatikana kwa shughuli nyingine tu baada ya kukamilika kwa shughuli ya kwanza.

Kwanza, hebu tuone ikiwa kuna kutengwa kwa shughuli katika shughuli kutoka kwa thread kuu. Wacha tufungue madirisha 2 ya terminal.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Hakuna kutengwa. Uzi mmoja unaona yule wa pili aliyefungua muamala anafanya nini.

Wacha tuone ikiwa shughuli za nyuzi tofauti tuone kinachoendelea ndani yao.

Hebu tufungue madirisha 2 ya terminal na tufungue shughuli 2 kwa sambamba.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Shughuli sambamba kuona data ya kila mmoja. Kwa hivyo, tulipata rahisi zaidi, lakini pia kiwango cha kutengwa cha haraka zaidi, SOMA BILA KUJITOA.

Kimsingi, hii inaweza kutarajiwa kwa ulimwengu, ambao utendaji umekuwa kipaumbele kila wakati.

Je, ikiwa tunahitaji kiwango cha juu cha kutengwa katika shughuli za ulimwengu?

Hapa unahitaji kufikiria kwa nini viwango vya kutengwa vinahitajika wakati wote na jinsi wanavyofanya kazi.

Kiwango cha juu zaidi cha kutengwa, SERIALIZE, inamaanisha kuwa matokeo ya miamala iliyotekelezwa sambamba ni sawa na utekelezaji wao wa mfululizo, ambao unahakikisha kutokuwepo kwa migongano.

Tunaweza kufanya hivi kwa kutumia kufuli mahiri kwenye ObjectScript, ambayo ina matumizi mengi tofauti: unaweza kufanya mara kwa mara, kwa kuongeza, kufunga mara nyingi kwa amri. Lock.

Viwango vya chini vya kutengwa ni ubadilishanaji iliyoundwa ili kuongeza kasi ya hifadhidata.

Hebu tuone jinsi tunavyoweza kufikia viwango tofauti vya kujitenga kwa kutumia kufuli.

Opereta huyu hukuruhusu kuchukua sio tu kufuli za kipekee zinazohitajika kubadilisha data, lakini kinachojulikana kama kufuli zilizoshirikiwa, ambazo zinaweza kuchukua nyuzi kadhaa sambamba wakati zinahitaji kusoma data ambayo haipaswi kubadilishwa na michakato mingine wakati wa mchakato wa kusoma.

Maelezo zaidi kuhusu njia ya kuzuia awamu mbili katika Kirusi na Kiingereza:

Uzuiaji wa awamu mbili
Kufunga kwa awamu mbili

Ugumu ni kwamba wakati wa shughuli hali ya hifadhidata inaweza kuwa haiendani, lakini data hii isiyo sawa inaonekana kwa michakato mingine. Jinsi ya kuepuka hili?

Kutumia kufuli, tutaunda madirisha ya mwonekano ambayo hali ya hifadhidata itakuwa thabiti. Na ufikiaji wote wa madirisha kama hayo ya kuonekana kwa hali iliyokubaliwa itadhibitiwa na kufuli.

Kufuli zilizoshirikiwa kwenye data sawa zinaweza kutumika tena—michakato kadhaa inaweza kuzichukua. Kufuli hizi huzuia michakato mingine kubadilisha data, i.e. hutumika kuunda madirisha ya hali ya hifadhidata thabiti.

Kufuli za kipekee hutumiwa kwa mabadiliko ya data - mchakato mmoja tu ndio unaweza kuchukua kufuli kama hiyo. Kufuli ya kipekee inaweza kuchukuliwa na:

  1. Mchakato wowote ikiwa data ni bure
  2. Mchakato tu ambao una kufuli iliyoshirikiwa kwenye data hii na ulikuwa wa kwanza kuomba kufuli ya kipekee.

Shughuli katika InterSystems IRIS globals

Kadiri dirisha la mwonekano linavyopungua, ndivyo michakato mingine inavyopaswa kuingojea, lakini hali ya hifadhidata ndani yake inaweza kuwa thabiti zaidi.

READ_COMMITTED - kiini cha kiwango hiki ni kwamba tunaona tu data iliyojitolea kutoka kwa nyuzi zingine. Ikiwa data katika shughuli nyingine bado haijafanywa, basi tunaona toleo lake la zamani.

Hii inaruhusu sisi kusawazisha kazi badala ya kusubiri kufuli kutolewa.

Bila hila maalum, hatutaweza kuona toleo la zamani la data katika IRIS, kwa hivyo tutalazimika kufanya na kufuli.

Kwa hivyo, tutalazimika kutumia kufuli zilizoshirikiwa ili kuruhusu data isomwe tu wakati wa uthabiti.

Wacha tuseme tuna msingi wa watumiaji ^mtu wanaohamisha pesa.

Wakati wa uhamisho kutoka kwa mtu 123 hadi mtu 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)

Wakati wa kuomba kiasi cha pesa kutoka kwa mtu 123 kabla ya kutoa deni lazima uambatane na kizuizi cha kipekee (kwa chaguo-msingi):

LOCK +^person(123)
Write ^person(123)

Na ikiwa unahitaji kuonyesha hali ya akaunti katika akaunti yako ya kibinafsi, basi unaweza kutumia kufuli iliyoshirikiwa au usiitumie kabisa:

LOCK +^person(123)#”S”
Write ^person(123)

Walakini, ikiwa tunadhania kuwa shughuli za hifadhidata hufanywa karibu mara moja (wacha nikukumbushe kuwa ulimwengu ni muundo wa kiwango cha chini zaidi kuliko jedwali la uhusiano), basi hitaji la kiwango hiki hupungua.

INAYORUDIWA KUSOMA - Kiwango hiki cha kutengwa kinaruhusu usomaji mwingi wa data ambayo inaweza kurekebishwa na miamala inayofanyika kwa wakati mmoja.

Kwa hivyo, tutalazimika kuweka kufuli iliyoshirikiwa wakati wa kusoma data ambayo tunabadilisha na kufuli za kipekee kwenye data tunayobadilisha.

Kwa bahati nzuri, operator wa LOCK inakuwezesha kuorodhesha kwa undani kufuli zote muhimu, ambazo kunaweza kuwa na mengi, katika taarifa moja.

LOCK +^person(123, amount)#”S”
чтение ^person(123, amount)

shughuli zingine (kwa wakati huu nyuzi zinazofanana zinajaribu kubadilisha ^mtu(123, kiasi), lakini haziwezi)

LOCK +^person(123, amount)
изменение ^person(123, amount)
LOCK -^person(123, amount)

чтение ^person(123, amount)
LOCK -^person(123, amount)#”S”

Wakati wa kuorodhesha kufuli zilizotenganishwa na koma, huchukuliwa kwa kufuatana, lakini ukifanya hivi:

LOCK +(^person(123),^person(242))

kisha zinachukuliwa kwa atomi zote mara moja.

SERIALIZE - itatubidi tuweke kufuli ili hatimaye miamala yote iliyo na data ya pamoja itekelezwe kwa kufuatana. Kwa mbinu hii, kufuli nyingi zinapaswa kuwa za kipekee na kuchukuliwa kwenye maeneo madogo zaidi ya kimataifa kwa utendakazi.

Ikiwa tunazungumza juu ya uwekaji pesa kwenye ^mtu wa kimataifa, basi kiwango cha kutengwa cha SERIALIZE pekee ndicho kinachokubalika kwake, kwani pesa lazima zitumike kwa mfuatano madhubuti, vinginevyo inawezekana kutumia kiasi sawa mara kadhaa.

4. Kudumu

Nilifanya vipimo kwa kukata ngumu kwa chombo kwa kutumia

docker kill my-iris

Msingi uliwavumilia vizuri. Hakuna matatizo yaliyotambuliwa.

Hitimisho

Kwa ulimwengu, InterSystems IRIS ina usaidizi wa muamala. Wao ni kweli atomiki na ya kuaminika. Ili kuhakikisha uthabiti wa hifadhidata kulingana na ulimwengu, juhudi za mpangaji programu na utumiaji wa miamala zinahitajika, kwa kuwa haina miundo changamano iliyojengewa ndani kama vile funguo za kigeni.

Kiwango cha kutengwa kwa ulimwengu bila kutumia kufuli ni SOMA BILA KUAMINIWA, na unapotumia kufuli inaweza kuhakikishwa hadi kiwango cha SERIALIZE.

Usahihi na kasi ya shughuli kwenye ulimwengu inategemea sana ustadi wa mpanga programu: kadiri kufuli zinazoshirikiwa zaidi zinatumiwa wakati wa kusoma, kiwango cha juu cha kutengwa, na kufuli za kipekee zaidi zinachukuliwa, ndivyo utendakazi unavyoharakisha.

Chanzo: mapenzi.com

Kuongeza maoni