Danûstandinên li InterSystems IRIS globals

Danûstandinên li InterSystems IRIS globalsInterSystems IRIS DBMS ji bo hilanîna daneyan - gerdûnî strukturên balkêş piştgirî dike. Di bingeh de, ev bişkokên pir-astî ne ku bi celebên danûstendinê, fonksiyonên bilez ên ji bo veguheztina darên daneyê, kilît û zimanê wê yê ObjectScript-ê hene.

Zêdetir li ser gerdûnan di rêze gotaran de bixwînin "Global ji bo hilanîna daneyan şûrên xezîneyê ne":

Darên. Beş 1
Darên. Beş 2
Rêzikên kêm. Beş 3

Min eleqedar kir ka danûstendinên li gerdûnan çawa têne bicîh kirin, çi taybetmendî hene. Beriya her tiştî, ev avahiyek bi tevahî cûda ye ji bo hilanîna daneyan ji tabloyên gelemperî. Asta pir kêmtir.

Wekî ku ji teoriya databasên têkildar tê zanîn, pêkanîna baş a danûstendinan divê hewcedariyên xwe bicîh bîne TIRŞ:

A - Atomî (atomî). Hemî guhertinên ku di danûstendinê de hatine çêkirin an jî qet tune têne tomar kirin.

C - Lihevhatî. Piştî ku danûstendinek qediya, divê rewşa mentiqî ya databasê bi hundurê hevgirtî be. Bi gelek awayan ev hewcedarî bernameçêker eleqedar dike, lê di mijara databasên SQL de ew bi kilîtên biyanî jî têkildar e.

Ez - Veqetînim. Danûstandinên ku di paralel de têne meşandin divê bandorê li hev nekin.

D - Dor. Piştî bidawîbûna serketî ya danûstendinê, divê pirsgirêkên di astên jêrîn de (mînak têkçûna hêzê) bandorê li daneyên ku ji hêla danûstendinê ve hatî guhertin bandor neke.

Gerdûnî strukturên daneya ne-girêdayî ne. Ew hatine sêwirandin ku li ser hardware pir tixûbdar super bi lez bixebitin. Ka em li pêkanîna danûstendinên di gerdûnan de bi kar bînin binêrin wêneya dokera fermî ya IRIS.

Ji bo piştgirîkirina danûstendinên di IRIS de, emrên jêrîn têne bikar anîn: TSTART, TCOMMIT, TROLLBACK.

1. Atomîbûn

Rêya herî hêsan a kontrolkirina atomî ye. Em ji konsolê databasê kontrol dikin.

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

Paşê em encam didin:

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

Em distînin:

1 2 3

Her tişt baş e. Atomicity tê parastin: hemî guhertin têne tomar kirin.

Werin em peywirê tevlihev bikin, xeletiyek bidin nasîn û bibînin ka danûstendin çawa tê xilas kirin, qismî an jî qet nebe.

Ka em dîsa atomîsîteyê kontrol bikin:

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

Dûv re em ê bi zorê konteynerê rawestînin, wê bidin destpêkirin û bibînin.

docker kill my-iris

Ev ferman hema hema bi girtina hêzê re wekhev e, ji ber ku ew îşaretek SIGKILL dişîne da ku pêvajo tavilê rawestîne.

Dibe ku danûstandin bi qismî xilas bû?

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

- Na, ew xilas nebûye.

Ka em fermana vegerê biceribînin:

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)

Tiştek jî xilas nebûye.

2. Lihevhatî

Ji ber ku di databasên li ser bingeha gerdûnî de, mifteyên li ser gerdûnan jî têne çêkirin (bihêle ez ji we re bi bîr bînim ku gerdûnî ji bo hilanîna daneyan ji tabloya pêwendiyê avahiyek nizmtir e), ji bo bicîhanîna hewcedariya hevgirtinê, divê guhertinek di mifteyê de were girtin. di heman danûstandinê de wekî guherînek di gerdûnî de.

Mînakî, me kesek ^ gerdûnî heye, ku em tê de kesayetan hildigirin û em TIN-ê wekî kilît bikar tînin.

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

Ji bo ku em li ser paşnav û paşnav lêgerînek bilez hebe, me mifteya ^index çêkir.

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

Ji bo ku databas hevgirtî be, divê em kesayeta bi vî rengî lê zêde bikin:

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

Li gorî vê yekê, dema ku jêbirin divê em danûstendinek jî bikar bînin:

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

Bi gotinek din, bicihanîna hewcedariya hevgirtinê bi tevahî li ser milên bernameçêker dimîne. Lê dema ku dor tê ser globalan, ev yek normal e, ji ber xwezaya wan ya nizm.

3. Tecrîd

Li vir çolê dest pê dike. Gelek bikarhêner bi hevdemî li ser heman databasê dixebitin, heman daneyan diguherînin.

Rewş bi dema ku gelek bikarhêner bi hevdemî bi heman depoya kodê re dixebitin û hewl didin ku di heman demê de li gelek pelan di yek carî de guhertinan pêk bînin re hevaheng e.

Pêdivî ye ku databas hemî di wextê rast de rêz bike. Bihesibînin ku di pargîdaniyên ciddî de tewra kesek taybetî heye ku berpirsiyarê kontrolkirina guhertoyê ye (ji bo hevgirtina şaxan, çareserkirina nakokiyan, hwd.), û databas divê van hemîyan di wextê rast de bike, tevliheviya peywirê û rastbûna sêwirana databasê û koda ku jê re xizmet dike.

Database nikare wateya kiryarên ku ji hêla bikarhêneran ve têne kirin fam bike da ku ji pevçûnan dûr nekevin heke ew li ser heman daneyê dixebitin. Ew tenê dikare yek danûstendina ku bi yekî din re nakokî betal bike, an jî wan bi rêzdarî bimeşîne.

Pirsgirêkek din jî ev e ku di dema pêkanîna danûstendinekê de (berî peywirdarkirinê), dibe ku rewşa databasê nelihev be, ji ber vê yekê tê xwestin ku danûstendinên din negihîjin rewşa nehevgirtî ya databasê, ya ku di databasên têkildar de têne bidestxistin. bi gelek awayan: çêkirina wêneyan, rêzikên pir-guherto û hwd.

Dema ku danûstendinên bi paralel têne kirin, ji bo me girîng e ku ew destwerdana hevûdu nekin. Ev milkê tecrîdê ye.

SQL 4 astên veqetandinê diyar dike:

  • BİXWÎNE BİXWÎNE
  • BİXWÎNE BİXWÎNE
  • REPEATABLE READ
  • SERIALIZABLE

Werin em li her astê cuda binerin. Mesrefên pêkanîna her astê hema hema bi rengek mezin dibe.

BİXWÎNE BİXWÎNE - ev asta herî nizm a tecrîdê ye, lê di heman demê de ya herî zû ye. Danûstandin dikarin guhertinên ku ji hêla hev ve hatine çêkirin bixwînin.

BİXWÎNE BİXWÎNE asta din a tecrîdê ye, ku lihevkirinek e. Danûstendin nikarin guheztinên hevûdu berî kombûnê bixwînin, lê ew dikarin her guheztinên ku piştî peywirê hatine çêkirin bixwînin.

Ger me T1 danûstendinek dirêj hebe, ku tê de di danûstendinên T2, T3 ... Tn de pêk hatin, ku bi heman daneya T1 re xebitî, wê hingê dema ku daneyên T1-ê daxwaz bikin em ê her carê encamek cûda bistînin. Ji vê diyardeyê re xwendina bê dubarekirin tê gotin.

REPEATABLE READ - Di vê asta veqetandinê de me fenomena xwendina ne-dubarebar tune ye, ji ber vê yekê ku ji bo her daxwazek ji bo xwendina daneyê, wêneyek daneya encamê tê afirandin û dema ku di heman danûstendinê de ji nû ve were bikar anîn, daneyên ji wêneyê tê bikaranîn. Lêbelê, gengaz e ku meriv daneyên fantomê di vê asta veqetandinê de bixwîne. Ev tê wateya xwendina rêzikên nû yên ku ji hêla danûstendinên pejirandî yên paralel ve hatine zêdekirin.

SERIALIZABLE - asta herî bilind ya insulasyonê. Ew bi vê yekê ve tête diyar kirin ku daneyên ku bi her awayî di danûstendinê de têne bikar anîn (xwendin an guhertin) tenê piştî qedandina danûstendina yekem ji danûstandinên din re peyda dibe.

Pêşîn, em fêhm bikin ka gelo di danûstendinê de ji mijara sereke veqetandina operasyonan heye. Ka em 2 pencereyên termînalê vekin.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Tecrîd nîne. Mijarek dibîne ku yê duyemîn ê ku danûstendinê vekiriye çi dike.

Ka em bibînin ka danûstandinên mijarên cihêreng dibînin ka di hundurê wan de çi diqewime.

Ka em 2 pencereyên termînalê vekin û 2 danûstendinan bi paralel vekin.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Danûstandinên paralel daneyên hevdu dibînin. Ji ber vê yekê, me asta herî hêsan, lê di heman demê de asta îzolasyonê ya zûtirîn jî girt, READ UNCOMMITED.

Di prensîbê de, ev dikare ji bo gerdûnan were hêvî kirin, ji bo ku performans her gav pêşanî ye.

Ger di operasyonên li ser gerdûnan de hewcedariya me bi astek bilindtir a tecrîdê hebe çi dibe?

Li vir hûn hewce ne ku bifikirin ka çima astên îzolasyonê bi tevahî hewce ne û ew çawa dixebitin.

Asta îzolasyonê ya herî bilind, SERIALIZE, tê vê wateyê ku encama danûstendinên ku bi paralelî têne darve kirin bi pêkanîna wan a rêzdar re wekhev e, ku nebûna pevçûnan garantî dike.

Em dikarin vê yekê bi karanîna kilîdên jîr ên di ObjectScript de bikin, ku gelek karanîna wan hene: hûn dikarin bi fermanê kilîtkirina birêkûpêk, zêde, piralî bikin. LOCK.

Asta îzolasyonê ya jêrîn bazirganî ne ku ji bo zêdekirina leza databasê hatine çêkirin.

Ka em bibînin ka em çawa dikarin bi karanîna qefleyan astên cihêreng ên îzolasyonê bi dest bixin.

Ev operator destûrê dide we ku hûn ne tenê qefleyên taybetî yên ku ji bo guheztina daneyan hewce ne, lê bi navê kilîdên hevbeş bigirin, ku dikarin çend mijaran bi hev re bigirin dema ku ew hewce ne ku daneyên bixwînin ku divê di pêvajoya xwendinê de ji hêla pêvajoyên din ve neyên guheztin.

Zêdetir agahdarî di derbarê rêbaza astengkirina du-qonaxê de bi rûsî û îngilîzî:

Astengkirina du qonax
Girtina du qonax

Zehmetî ev e ku di dema danûstendinê de dibe ku rewşa databasê nakok be, lê ev daneya nakok ji pêvajoyên din re xuya ye. Meriv çawa ji vê yekê dûr dikeve?

Bi karanîna qefleyan, em ê pencereyên dîtbariyê biafirînin ku tê de dê rewşa databasê domdar be. Û hemî gihîştina pencereyên weha yên xuyabûna dewleta lihevhatî dê ji hêla qefleyan ve were kontrol kirin.

Girtiyên hevpar ên li ser heman daneyê ji nû ve têne bikar anîn - gelek pêvajo dikarin wan bigirin. Van kilît rê nadin ku pêvajoyên din biguhezînin daneyan, ango. ew ji bo avakirina pencereyên rewşa databasê ya hevgirtî têne bikar anîn.

Ji bo guheztina daneyan kilîdên taybetî têne bikar anîn - tenê pêvajoyek dikare qeflek wusa bigire. Girtiyek taybetî dikare ji hêla:

  1. Ger daneya belaş be her pêvajoyek
  2. Tenê pêvajoyek ku li ser vê daneyê kilîtek hevpar heye û yekem bû ku daxwaza kilîtek taybetî kir.

Danûstandinên li InterSystems IRIS globals

Pencereya dîtbariyê her ku teng dibe, pêvajoyên din jî dirêjtir li benda wê ne, lê rewşa databasê ya di hundurê wê de domdartir dibe.

READ_COMMITTED - Esasê vê astê ev e ku em tenê daneyên pejirandî ji mijarên din dibînin. Ger daneyên di danûstendinek din de hîn nehatibe kirin, wê hingê em guhertoya wê ya kevn dibînin.

Ev rê dide me ku li şûna ku em li benda berdana kilît bin, xebatê paralel bikin.

Bêyî hîleyên taybetî, em ê nikaribin guhertoya kevin a daneyan di IRIS de bibînin, ji ber vê yekê em ê neçar bimînin ku bi qefleyan ve mijûl bibin.

Li gorî vê yekê, em neçar in ku qefleyên hevbeş bikar bînin da ku destûr bidin ku dane tenê di demên hevgirtî de werin xwendin.

Ka em bibêjin bingeheke me ya bikarhêner ^kes heye ku pereyan diguhezîne hev.

Dema veguhestinê ji kesê 123 ji bo kesê 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)

Dema daxwazkirina mîqdara drav ji kesê 123 berî debitkirinê pêdivî ye ku bi blokek taybetî (bi xwerû):

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

Û heke hûn hewce ne ku di hesabê xweya kesane de statûya hesabê nîşan bidin, wê hingê hûn dikarin qeflek hevpar bikar bînin an jî qet bikar neynin:

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

Lêbelê, heke em texmîn bikin ku operasyonên databasê hema hema tavilê têne kirin (bihêle ez ji we re bi bîr bînim ku gerdûnî ji tabloyek pêwendiyê avahiyek pir nizmtir e), wê hingê hewcedariya vê astê kêm dibe.

REPEATABLE READ - Vê asta veqetandinê dihêle ku gelek xwendina daneyan ku ji hêla danûstendinên hevdem ve werin guheztin.

Li gorî vê yekê, em neçar in ku li ser xwendina daneyên ku em diguhezînin qeflek hevbeş û li ser daneyên ku em diguhezînin kilîtkirinek taybetî deynin.

Xweşbextane, operatorê LOCK dihêle hûn di yek gotinê de hemî kilîdên pêwîst, yên ku dikarin pir hebin, bi hûrgulî navnîş bikin.

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

operasyonên din (di vê demê de mijarên paralel hewl didin ku ^kes (123, mîqdar) biguherînin, lê nikarin)

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

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

Dema ku kilîdên ku bi kommasê têne veqetandin navnîş dikin, ew bi rêz têne girtin, lê heke hûn wiya bikin:

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

hingê ew bi yekcarî bi atomî têne girtin.

SERIALYALZE bikin - em neçar in ku qefleyan saz bikin da ku di dawiyê de hemî danûstendinên ku daneyên hevpar hene bi rêzdarî bêne darve kirin. Ji bo vê nêzîkatiyê, divê pir qefle bêkêmasî bin û ji bo performansê li deverên herî piçûk ên gerdûnî werin girtin.

Ger em li ser ^kesê gerdûnî behsa debitkirina fonan bikin, wê hingê tenê asta îzolasyona SERIALIZE ji bo wê tê pejirandin, ji ber ku pêdivî ye ku drav bi hişkî li pey hev were xerc kirin, wekî din gengaz e ku heman mîqdar çend caran were xerc kirin.

4. Duristbûn

Min ceribandinên bi birrîna hişk a konteynerê bi kar anîn

docker kill my-iris

Bingehê baş tehemula wan kir. Ti pirsgirêk nehatin tespîtkirin.

encamê

Ji bo gerdûnan, InterSystems IRIS piştgiriya danûstendinê heye. Ew bi rastî atomî û pêbawer in. Ji bo misogerkirina hevgirtîbûna databasek ku li ser bingeha gerdûnî ye, hewildanên bernamenûs û karanîna danûstendinan hewce ne, ji ber ku ew xwedan avahiyên çêkirî yên tevlihev ên wekî kilîtên biyanî nînin.

Asta îzolasyonê ya gerdûnan bêyî karanîna qefleyan BÊ BIXWÎNE BİXWÎNE, û dema ku qefleyan bikar tîne ew dikare heya asta SERÎALIZE were misoger kirin.

Rastî û leza danûstendinên li ser gerdûnan pir bi jêhatîbûna bernameçêker ve girêdayî ye: gava ku di xwendinê de kilîdên parvekirî yên berfirehtir têne bikar anîn, ew qas asta îzolasyonê bilindtir dibe, û her ku kilîdên taybetî yên teng têne girtin, performansa zûtir dibe.

Source: www.habr.com

Add a comment