Mga transaksyon sa InterSystems IRIS globals

Mga transaksyon sa InterSystems IRIS globalsAng InterSystems IRIS DBMS nagsuporta sa makapaikag nga mga istruktura alang sa pagtipig sa datos - globals. Sa tinuud, kini mga multi-level nga mga yawe nga adunay lainlaing mga dugang nga mga butang sa porma sa mga transaksyon, paspas nga mga gimbuhaton alang sa pagtabok sa mga punoan sa datos, mga kandado ug kaugalingon nga sinultian nga ObjectScript.

Basaha ang dugang bahin sa mga global sa serye sa mga artikulo nga "Ang mga kalibutanon mga treasure-swords para sa pagtipig sa datos":

Mga kahoy. Bahin 1
Mga kahoy. Bahin 2
Talagsaon nga mga han-ay. Bahin 3

Nahimo kong interesado kung giunsa ang mga transaksyon gipatuman sa mga global, kung unsang mga bahin ang naa. Pagkahuman, kini usa ka hingpit nga lahi nga istruktura alang sa pagtipig sa datos kaysa sa naandan nga mga lamesa. Labing ubos nga lebel.

Ingon sa nahibal-an gikan sa teorya sa relational database, ang usa ka maayo nga pagpatuman sa mga transaksyon kinahanglan nga makatagbaw sa mga kinahanglanon ASID:

A - Atomic (atomicity). Ang tanan nga mga pagbag-o nga gihimo sa transaksyon o wala gyud natala.

C - Pagkamakanunayon. Pagkahuman sa usa ka transaksyon, ang lohikal nga kahimtang sa database kinahanglan nga managsama sa sulod. Sa daghang mga paagi kini nga kinahanglanon adunay kalabotan sa programmer, apan sa kaso sa mga database sa SQL kini usab may kalabotan sa mga langyaw nga yawe.

Ako - Ilain. Ang mga transaksyon nga nagdagan nga managsama kinahanglan dili makaapekto sa usag usa.

D - Malungtaron. Human sa malampuson nga pagkompleto sa usa ka transaksyon, ang mga problema sa ubos nga lebel (pagkapakyas sa kuryente, pananglitan) kinahanglan dili makaapekto sa datos nga giusab sa transaksyon.

Ang mga global kay dili relasyonal nga istruktura sa datos. Gidisenyo sila nga modagan nga kusog kaayo sa limitado nga hardware. Atong tan-awon ang pagpatuman sa mga transaksyon sa globals gamit opisyal nga IRIS docker nga imahe.

Aron pagsuporta sa mga transaksyon sa IRIS, ang mosunod nga mga sugo gigamit: PAGSUGOD, TCOMMIT, TROLLBACK.

1. Atomidad

Ang pinakasayon ​​nga paagi sa pagsusi mao ang atomicity. Atong susihon gikan sa database console.

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

Dayon atong tapuson:

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

Atong makuha:

1 2 3

Maayo ra ang tanan. Ang atomicity gipadayon: ang tanan nga mga pagbag-o girekord.

Himoon nga komplikado ang buluhaton, ipaila ang usa ka sayup ug tan-awa kung giunsa ang transaksyon natipig, partially o wala gyud.

Atong susihon pag-usab ang atomicity:

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

Unya pugson namo nga ihunong ang sudlanan, ilunsad kini ug tan-awa.

docker kill my-iris

Kini nga sugo halos katumbas sa usa ka force shutdown, tungod kay kini nagpadala ug SIGKILL signal aron mahunong dayon ang proseso.

Tingali ang transaksyon partially naluwas?

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

- Dili, wala kini nakalahutay.

Atong sulayan ang rollback nga sugo:

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)

Wala usab nakalahutay.

2. pagkamakanunayon

Tungod kay sa mga database nga gibase sa mga global, ang mga yawe gihimo usab sa mga global (pahinumdoman ko ikaw nga ang usa ka global usa ka ubos nga lebel nga istruktura alang sa pagtipig sa datos kaysa usa ka relational nga lamesa), aron matubag ang kinahanglanon nga pagkamakanunayon, kinahanglan nga ilakip ang pagbag-o sa yawe. sa parehas nga transaksyon sama sa pagbag-o sa global.

Pananglitan, aduna kitay global ^tawo, diin atong gitipigan ang mga personalidad ug atong gigamit ang TIN isip yawe.

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

Aron adunay dali nga pagpangita pinaagi sa apelyido ug una nga ngalan, among gihimo ang ^ index key.

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

Aron ang database mahimong makanunayon, kinahanglan natong idugang ang persona nga sama niini:

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

Tungod niini, kung magtangtang kinahanglan usab nga mogamit usa ka transaksyon:

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

Sa laing pagkasulti, ang pagtuman sa kinahanglanon sa pagkamakanunayon bug-os nga naa sa mga abaga sa programmer. Apan kung bahin sa mga global, kini normal, tungod sa ilang ubos nga lebel nga kinaiya.

3. Pag-inusara

Dinhi nagsugod ang mga ihalas. Daghang mga tiggamit ang dungan nga nagtrabaho sa parehas nga database, nagbag-o sa parehas nga datos.

Ang sitwasyon ikatandi sa diha nga daghang mga tiggamit dungan nga nagtrabaho uban sa sama nga code repository ug naningkamot sa dungan nga paghimo sa mga kausaban sa daghang mga file sa makausa.

Ang database kinahanglan nga ihan-ay kini tanan sa tinuud nga oras. Gikonsiderar nga sa mga seryoso nga kompanya adunay bisan usa ka espesyal nga tawo nga responsable sa pagkontrol sa bersyon (alang sa paghiusa sa mga sanga, pagsulbad sa mga panagbangi, ug uban pa), ug ang database kinahanglan nga buhaton kining tanan sa tinuud nga oras, ang pagkakomplikado sa buluhaton ug ang katukma sa disenyo sa database ug code nga nagsilbi niini.

Dili masabtan sa database ang kahulogan sa mga aksyon nga gihimo sa mga tiggamit aron malikayan ang mga panagbangi kung nagtrabaho sila sa parehas nga datos. Mahimo ra nga i-undo ang usa ka transaksyon nga sukwahi sa lain, o ipatuman kini nga sunud-sunod.

Ang laing problema mao nga sa panahon sa pagpatuman sa usa ka transaksyon (sa wala pa ang usa ka commit), ang kahimtang sa database mahimong magkasumpaki, mao nga kini tilinguhaon nga ang ubang mga transaksyon walay access sa dili managsama nga kahimtang sa database, nga makab-ot sa relational database. sa daghang mga paagi: paghimo og mga snapshot, multi-bersyon nga mga laray ug uban pa.

Kung nagpatuman sa mga transaksyon nga managsama, hinungdanon alang kanamo nga dili sila manghilabot sa usag usa. Kini ang kabtangan sa pagkahimulag.

Gihubit sa SQL ang 4 nga lebel sa pagkalainlain:

  • BASAHA NGA UNCOMMITTED
  • READ COMMITTED
  • MABALI NGA BASAHA
  • SERIALIZABLE

Atong tan-awon ang matag lebel nga gilain. Ang gasto sa pagpatuman sa matag ang-ang motubo halos exponentially.

BASAHA NGA UNCOMMITTED - kini ang pinakaubos nga lebel sa pag-inusara, apan sa samang higayon ang pinakapaspas. Ang mga transaksyon makabasa sa mga pagbag-o nga gihimo sa usag usa.

READ COMMITTED mao ang sunod nga lebel sa pag-inusara, nga usa ka pagkompromiso. Ang mga transaksyon dili makabasa sa mga kausaban sa usag usa sa dili pa ang commit, apan sila makabasa sa bisan unsa nga kausaban nga gihimo human sa commit.

Kung kita adunay taas nga transaksyon nga T1, diin ang mga commit nahitabo sa mga transaksyon nga T2, T3 ... Tn, nga nagtrabaho sa parehas nga datos sama sa T1, unya kung mangayo ug datos sa T1 makakuha kami usa ka lahi nga resulta matag higayon. Kini nga panghitabo gitawag nga dili masubli nga pagbasa.

MABALI NGA BASAHA — sa kini nga lebel sa pagkahimulag wala kami adunay panghitabo sa dili masubli nga pagbasa, tungod sa kamatuoran nga alang sa matag hangyo nga basahon ang datos, usa ka snapshot sa datos sa resulta ang gihimo ug kung gigamit pag-usab sa parehas nga transaksyon, ang datos gikan sa snapshot gigamit. Bisan pa, posible nga mabasa ang datos sa phantom sa kini nga lebel sa pagkalain. Kini nagtumong sa pagbasa sa bag-ong mga laray nga gidugang sa parallel nga nahimo nga mga transaksyon.

SERIALIZABLE - ang labing taas nga lebel sa pagbulag. Kini gihulagway pinaagi sa kamatuoran nga ang datos nga gigamit sa bisan unsang paagi sa usa ka transaksyon (pagbasa o pagbag-o) mahimong magamit sa ubang mga transaksyon pagkahuman lamang sa pagkompleto sa unang transaksyon.

Una, atong mahibal-an kung adunay pag-inusara sa mga operasyon sa usa ka transaksyon gikan sa main thread. Atong ablihan ang 2 terminal windows.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Walay isolation. Nakita sa usa ka thread kung unsa ang gibuhat sa ikaduha nga nagbukas sa transaksyon.

Atong tan-awon kung ang mga transaksyon sa lainlaing mga hilo makita kung unsa ang nahitabo sa sulod niini.

Atong ablihan ang 2 ka terminal windows ug ablihan ang 2 ka transaksyon nga magkaparehas.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Ang parallel nga mga transaksyon makakita sa datos sa usag usa. Mao nga, nakuha namon ang pinakasimple, apan usab ang labing paspas nga lebel sa pagkalainlain, BASAHA nga UNCOMMITED.

Sa prinsipyo, kini mahimong mapaabut alang sa mga global, diin ang pasundayag kanunay nga usa ka prayoridad.

Unsa kaha kung kinahanglan naton ang usa ka mas taas nga lebel sa pag-inusara sa mga operasyon sa mga global?

Dinhi kinahanglan nimo nga hunahunaon kung ngano nga kinahanglan ang lebel sa pagkalainlain ug kung giunsa kini molihok.

Ang labing taas nga lebel sa pagkahimulag, ang SERIALIZE, nagpasabot nga ang resulta sa mga transaksyon nga gipatuman sa parallel katumbas sa ilang sequential execution, nga naggarantiya sa pagkawala sa mga bangga.

Mahimo namo kini gamit ang mga smart lock sa ObjectScript, nga adunay daghang lain-laing gamit: mahimo nimo ang regular, incremental, multiple locking gamit ang command LOCK.

Ang ubos nga lebel sa pagkahimulag mao ang mga trade-off nga gidisenyo aron madugangan ang katulin sa database.

Atong tan-awon kung giunsa naton makab-ot ang lainlaing lebel sa pag-inusara gamit ang mga kandado.

Gitugotan ka sa kini nga operator nga magkuha dili lamang mga eksklusibo nga kandado nga gikinahanglan aron mabag-o ang datos, apan ang gitawag nga gipaambit nga mga kandado, nga mahimo’g magkuha daghang mga hilo nga managsama kung kinahanglan nila nga basahon ang datos nga dili kinahanglan usbon sa ubang mga proseso sa panahon sa proseso sa pagbasa.

Dugang nga kasayuran bahin sa pamaagi sa pag-block sa duha ka hugna sa Russian ug English:

Duha ka hugna nga pag-block
Duha ka hugna nga pag-lock

Ang kalisud mao nga sa panahon sa usa ka transaksyon ang kahimtang sa database mahimong dili managsama, apan kini nga dili managsama nga datos makita sa ubang mga proseso. Unsaon paglikay niini?

Gamit ang mga kandado, maghimo kami og visibility windows diin ang kahimtang sa database mahimong makanunayon. Ug ang tanan nga pag-access sa ingon nga mga bintana sa visibility sa gikasabutan nga estado kontrolado sa mga kandado.

Ang gipaambit nga mga kandado sa parehas nga datos magamit pag-usab-daghang mga proseso ang makakuha niini. Kini nga mga kandado nagpugong sa ubang mga proseso sa pagbag-o sa datos, i.e. gigamit sila sa pagporma sa mga bintana sa makanunayon nga estado sa database.

Ang mga eksklusibong kandado gigamit alang sa mga pagbag-o sa datos - usa ra ka proseso ang makakuha sa ingon nga kandado. Ang usa ka eksklusibo nga kandado mahimong makuha pinaagi sa:

  1. Bisan unsang proseso kung libre ang datos
  2. Ang proseso ra nga adunay gipaambit nga kandado sa kini nga datos ug mao ang una nga nangayo usa ka eksklusibo nga kandado.

Mga transaksyon sa InterSystems IRIS globals

Ang mas pig-ot nga bintana sa visibility, mas dugay ang ubang mga proseso nga maghulat niini, apan mas makanunayon ang kahimtang sa database sa sulod niini.

READ_COMMITTED — ang esensya sa kini nga lebel mao nga makita ra naton ang mga nahimo nga datos gikan sa ubang mga hilo. Kung ang datos sa laing transaksyon wala pa nahimo, nan atong makita ang daan nga bersyon niini.

Kini nagtugot kanato sa pag-parallelize sa trabaho imbes nga maghulat sa kandado nga buhian.

Kung wala’y espesyal nga mga limbong, dili namon makita ang daan nga bersyon sa datos sa IRIS, mao nga kinahanglan namon nga buhaton ang mga kandado.

Tungod niini, kinahanglan namong gamiton ang gipaambit nga mga kandado aron tugotan ang mga datos nga mabasa lamang sa mga higayon sa pagkamakanunayon.

Ingnon ta nga naa tay user base ^tawo nga nagtransfer ug kwarta sa usag usa.

Panahon sa pagbalhin gikan sa tawo 123 ngadto sa tawo 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)

Ang higayon sa paghangyo sa kantidad sa salapi gikan sa tawo 123 sa wala pa ang pag-debit kinahanglan nga inubanan sa usa ka eksklusibo nga bloke (sa default):

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

Ug kung kinahanglan nimo nga ipakita ang status sa account sa imong personal nga account, mahimo nimong gamiton ang usa ka gipaambit nga lock o dili kini gamiton:

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

Bisan pa, kung atong hunahunaon nga ang mga operasyon sa database gihimo hapit dayon (pahinumdoman ko ikaw nga ang mga global usa ka mas ubos nga lebel nga istruktura kaysa usa ka relational nga lamesa), nan ang panginahanglan alang niini nga lebel mikunhod.

MABALI NGA BASAHA - Kini nga lebel sa pagkahimulag nagtugot alang sa daghang mga pagbasa sa datos nga mahimong usbon sa dungan nga mga transaksyon.

Subay niini, kinahanglan nga magbutang kami usa ka gipaambit nga kandado sa pagbasa sa datos nga among gibag-o ug eksklusibo nga mga kandado sa datos nga among giusab.

Maayo na lang, ang LOCK operator nagtugot kanimo sa paglista sa detalye sa tanan nga gikinahanglan nga mga kandado, diin adunay daghan, sa usa ka pahayag.

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

ubang mga operasyon (niini nga panahon parallel threads mosulay sa pag-usab ^tawo(123, kantidad), apan dili mahimo)

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

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

Kung gilista ang mga kandado nga gibulag sa mga koma, kini gikuha nga sunud-sunod, apan kung buhaton nimo kini:

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

unya sila gikuha atomically tanan sa makausa.

SERYADO — Kinahanglan nga magbutang kami og mga kandado aron sa katapusan ang tanan nga mga transaksyon nga adunay sagad nga datos himuon nga sunud-sunod. Alang sa kini nga pamaagi, kadaghanan sa mga kandado kinahanglan nga eksklusibo ug makuha sa pinakagamay nga mga lugar sa kalibutan alang sa pasundayag.

Kung maghisgot kita bahin sa pag-debit sa mga pundo sa global ^tawo, nan ang SERIALIZE isolation level lang ang madawat para niini, tungod kay ang kwarta kinahanglan nga higpit nga gigugol nga sunud-sunod, kung dili posible nga mogasto sa parehas nga kantidad sa daghang beses.

4. Kalig-on

Naghimo ako og mga pagsulay nga adunay lisud nga pagputol sa sudlanan nga gigamit

docker kill my-iris

Gitugotan sila og maayo sa base. Wala'y nahibal-an nga mga problema.

konklusyon

Para sa mga global, ang InterSystems IRIS adunay suporta sa transaksyon. Sila tinuod nga atomic ug kasaligan. Aron masiguro ang pagkamakanunayon sa usa ka database nga gibase sa mga global, ang mga paningkamot sa programmer ug ang paggamit sa mga transaksyon gikinahanglan, tungod kay wala kini komplikado nga gitukod nga mga konstruksyon sama sa mga langyaw nga yawe.

Ang lebel sa pagkahimulag sa mga global nga wala mogamit mga kandado mao ang READ UNCOMMITED, ug kung mogamit mga kandado mahimo kini masiguro hangtod sa lebel sa SERIALIZE.

Ang katukma ug katulin sa mga transaksyon sa mga global nagdepende kaayo sa kahanas sa programmer: ang labi ka kaylap nga gipaambit nga mga kandado ang gigamit kung nagbasa, labi ka taas ang lebel sa pagkalainlain, ug labi ka hiktin nga eksklusibo nga mga kandado ang gikuha, labi ka paspas ang pasundayag.

Source: www.habr.com

Idugang sa usa ka comment