Transakzioak InterSystems IRIS globaletan

Transakzioak InterSystems IRIS globaletanInterSystems IRIS DBMSak datuak gordetzeko egitura interesgarriak onartzen ditu - globalak. Funtsean, maila anitzeko gakoak dira transakzio gisa, datuen zuhaitzak zeharkatzeko funtzio azkarrak, sarrailak eta bere ObjectScript lengoaia moduko ontasun gehigarriekin.

Irakurri globalari buruzko informazio gehiago "Globalak datuak gordetzeko altxorrak dira" artikulu sortan:

Zuhaitzak. 1. zatia
Zuhaitzak. 2. zatia
Array urriak. 3. zatia

Interesatu nintzen transakzioak globaletan nola inplementatzen diren, zein ezaugarri dauden. Azken finean, ohiko taulek baino egitura guztiz desberdina da datuak gordetzeko. Askoz maila baxuagoa.

Erlazio datu-baseen teoriatik ezagutzen denez, transakzioen ezarpen on batek bete behar ditu baldintzak ACID:

A - Atomikoa (atomikotasuna). Transakzioan egindako aldaketa guztiak edo bat ere ez erregistratzen dira.

C - Koherentzia. Transakzio bat amaitu ondoren, datu-basearen egoera logikoak barneko koherentzia izan behar du. Zentzu askotan eskakizun hau programatzaileari dagokio, baina SQL datu-baseen kasuan atzerriko gakoei ere dagokie.

I - Isolatu. Paraleloan egiten diren transakzioek ez lukete elkarri eragin behar.

D - Iraunkorra. Transakzio bat arrakastaz amaitu ondoren, maila baxuagoetako arazoek (elektrizitate elektrikoa, adibidez) ez lukete eragin behar transakzioak aldatutako datuetan.

Globalak erlaziorik gabeko datu-egiturak dira. Oso azkar exekutatzeko diseinatu ziren hardware oso mugatuan. Ikus dezagun transakzioen ezarpena globalak erabiliz IRIS docker irudi ofiziala.

IRISen transakzioak laguntzeko, komando hauek erabiltzen dira: HASI, TCOMMIT, TROLLBACK.

1. Atomikotasuna

Egiaztatzeko modurik errazena atomotasuna da. Datu-basearen kontsolatik egiaztatzen dugu.

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

Orduan ondorioztatzen dugu:

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

Lortzen dugu:

1 2 3

Dena ondo dago. Atomikotasuna mantentzen da: aldaketa guztiak erregistratzen dira.

Zaildu dezagun zeregina, sartu errore bat eta ikus dezagun transakzioa nola gordetzen den, partzialki edo ez.

Egiazta dezagun berriro atomotasuna:

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

Ondoren, edukiontzia indarrez geldituko dugu, abiarazi eta ikusiko dugu.

docker kill my-iris

Komando hau indarrez itzaltzearen parekoa da, SIGKILL seinalea bidaltzen baitu prozesua berehala gelditzeko.

Agian transakzioa partzialki gorde zen?

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

- Ez, ez da bizirik iraun.

Saia gaitezen rollback komandoa:

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)

Ezer ere ez da bizirik iraun.

2. Koherentzia

Globaletan oinarritutako datu-baseetan, gakoak globaletan ere egiten direnez (gogora dezagun global bat erlazio-taula baino datuak gordetzeko maila baxuagoko egitura bat dela), koherentzia-eskakizuna betetzeko, gako aldaketa sartu behar da. globalaren aldaketaren transakzio berean.

Adibidez, ^pertsona global bat dugu, eta bertan nortasunak gordetzen ditugu eta TIN erabiltzen dugu gako gisa.

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

Abizenaren eta izenaren arabera bilaketa azkar bat egiteko, ^index tekla egin dugu.

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

Datu-basea koherentea izan dadin, honelako pertsonaia gehitu behar dugu:

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

Horren arabera, ezabatzerakoan transakzio bat ere erabili behar dugu:

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

Beste era batera esanda, koherentzia-eskakizuna betetzea programatzailearen sorbaldetan dago erabat. Baina globalei dagokienez, hori normala da, maila baxuko izaeragatik.

3. Isolamendua

Hemen hasten dira basatiak. Erabiltzaile askok aldi berean lan egiten dute datu-base berean, datu berdinak aldatuz.

Egoera parekoa da erabiltzaile askok aldi berean kode biltegi berdinarekin lan egiten dutenean eta aldi berean fitxategi askotan aldaketak egiten saiatzen direnean.

Datu-baseak denbora errealean ordenatu beharko luke. Kontuan izanda enpresa serioetan bertsio-kontrolaz arduratzen den pertsona berezi bat ere badagoela (adarrak batu, gatazkak konpontzeko, etab.), eta datu-baseak hori guztia denbora errealean egin behar duela, zereginaren konplexutasuna eta zuzentasuna. datu-basearen diseinua eta balio duen kodea.

Datu-baseak ezin du ulertu erabiltzaileek egiten dituzten ekintzen esanahia, gatazkak saihesteko, datu berdinekin lan egiten badute. Beste batekin gatazkan dagoen transakzio bat bakarrik desegin dezake edo sekuentzialki exekutatu.

Beste arazo bat da transakzio baten exekuzioan zehar (konpromiso baten aurretik), datu-basearen egoera koherentea izan daitekeela, beraz, komeni da beste transakzio batzuek datu-basearen egoera inkoherenterako sarbidea ez izatea, datu-base erlazionaletan lortzen dena. modu askotan: argazkiak sortuz, bertsio anitzeko errenkadak etab.

Transakzioak paraleloan exekutatzen direnean, garrantzitsua da guretzat elkarren artean oztopatzea. Hau isolamenduaren propietatea da.

SQL-k 4 isolamendu maila definitzen ditu:

  • IRAKURRI KONPROMISO GABE
  • IRAKURRI KONPROMISOA
  • IRAKURKETA ERREPIKATZEA
  • SERIATZEA

Ikus ditzagun maila bakoitza bereizita. Maila bakoitza ezartzearen kostuak ia esponentzialki hazten dira.

IRAKURRI KONPROMISO GABE - hau da isolamendu maila baxuena, baina aldi berean azkarrena. Transakzioek elkarren artean egindako aldaketak irakur ditzakete.

IRAKURRI KONPROMISOA hurrengo isolamendu maila da, hau da, konpromisoa. Transakzioek ezin dituzte elkarren aldaketak irakurri konprometitu aurretik, baina konprometitu ondoren egindako aldaketak irakur ditzakete.

T1 transakzio luze bat badugu, zeinetan T2, T3 ... Tn transakzioetan konpromezuak egin ziren, T1-ren datu berdinekin lan egiten zuena, orduan T1-en datuak eskatzerakoan emaitza ezberdina lortuko dugu bakoitzean. Fenomeno horri irakurketa errepikaezina deitzen zaio.

IRAKURKETA ERREPIKATZEA — isolamendu maila honetan ez dugu irakurketa errepikaezina den fenomenorik, izan ere, datuak irakurtzeko eskaera bakoitzeko, emaitzaren datuen argazki bat sortzen da eta transakzio berean berrerabiltzen direnean, argazkiko datuak. erabiltzen da. Hala ere, isolamendu maila honetan datu mamuak irakur daitezke. Konprometitutako transakzio paraleloek gehitutako errenkada berriak irakurtzeari egiten dio erreferentzia.

SERIATZEA — Isolamendu maila gorena. Transakzio batean edozein modutan erabiltzen diren datuak (irakurketa edo aldaketa) beste transakzio batzuentzat erabilgarri bihurtzen direlako ezaugarria da, lehen transakzioa amaitu ondoren soilik.

Lehenik eta behin, ikus dezagun transakzio batean eragiketak hari nagusitik isolatuta dauden ala ez. Ireki ditzagun 2 terminal leiho.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Ez dago isolamendurik. Hari batek transakzioa ireki zuen bigarrenak zer egiten duen ikusten du.

Ea hari ezberdinetako transakzioek haien barruan zer gertatzen den ikusten duten.

Ireki ditzagun 2 terminal leiho eta ireki 2 transakzio paraleloan.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Transakzio paraleloek elkarren datuak ikusten dituzte. Beraz, isolamendu maila errazena, baina baita azkarrena ere lortu dugu, IRAKURRI KONPROMISO GABE.

Printzipioz, hori espero zitekeen globalentzat, zeinentzat errendimendua beti izan baita lehentasuna.

Zer gertatzen da globalen gaineko operazioetan isolamendu maila handiagoa behar badugu?

Hemen pentsatu behar duzu zergatik behar diren isolamendu mailak eta nola funtzionatzen duten.

Isolamendu maila gorenak, SERIALIZE, esan nahi du paraleloan exekutatzen diren transakzioen emaitza haien exekuzio sekuentzialaren baliokidea dela, eta horrek talkarik ez duela bermatzen du.

Hau egin dezakegu ObjectScript-en blokeo adimendunak erabiliz, erabilera ezberdin asko dituztenak: komandoarekin blokeo erregularra, inkrementala eta anitza egin dezakezu. LOCK.

Isolamendu maila baxuagoak datu-basearen abiadura handitzeko diseinatutako trukeak dira.

Ikus dezagun nola lor ditzakegun isolamendu maila desberdinak sarrailak erabiliz.

Operadore honek datuak aldatzeko beharrezkoak diren blokeo esklusiboak ez ezik, partekatutako blokeoak ere har ditzakete, irakurketa prozesuan zehar beste prozesu batzuek aldatu behar ez dituzten datuak irakurri behar dituztenean paraleloan hainbat hari har ditzaketenak.

Bi faseko blokeo metodoari buruzko informazio gehiago errusieraz eta ingelesez:

Blokeo bifasikoa
Blokeo bifasikoa

Zailtasuna da transakzio batean datu-basearen egoera koherentea izan daitekeela, baina datu koherenteak beste prozesu batzuentzat ikusten dira. Nola saihestu hau?

Blokeoak erabiliz, datu-basearen egoera koherentea izango den ikusgarritasun-leihoak sortuko ditugu. Eta hitzartutako egoeraren ikusgarritasun-leihoetarako sarbide guztiak sarrailak kontrolatuko ditu.

Datu berdinetan partekatutako blokeoak berrerabil daitezke; hainbat prozesuk har ditzakete. Blokeo hauek beste prozesu batzuek datuak aldatzea eragozten dute, hau da. datu-basearen egoera koherenteko leihoak osatzeko erabiltzen dira.

Datuen aldaketetarako blokeo esklusiboak erabiltzen dira - prozesu bakarrak har dezake blokeo hori. Blokeo esklusiboa honako hauek har dezakete:

  1. Edozein prozesu datuak doakoak badira
  2. Datu hauetan blokeo partekatua duen eta blokeo esklusibo bat eskatzen lehena izan den prozesua bakarrik.

Transakzioak InterSystems IRIS globaletan

Ikusgarritasun-leihoa zenbat eta estuagoa izan, orduan eta gehiago itxaron beharko dute beste prozesuek, baina orduan eta koherenteagoa izan daiteke bere baitan datu-basearen egoera.

READ_COMMITTED — Maila honen funtsa beste harietako datuak konprometituak soilik ikusten ditugula da. Beste transakzio bateko datuak oraindik konprometitu ez badira, bere bertsio zaharra ikusiko dugu.

Horri esker, lana paralelizatzea ahalbidetzen dugu, sarraila askatu arte itxaron beharrean.

Trikimailu berezirik gabe, ezingo dugu datuen bertsio zaharra ikusi IRISen, beraz, blokeoekin konformatu beharko dugu.

Horren arabera, partekatutako blokeoak erabili beharko ditugu datuak koherentzia-uneetan soilik irakur daitezen.

Demagun elkarri dirua transferitzen dion erabiltzaile-base ^pertsona bat dugula.

123 pertsonatik 242 pertsonara transferitzeko unea:

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)

Zordunketa egin aurretik 123 pertsonari diru-kopurua eskatzeko unea blokeo esklusibo batekin batera joan behar da (lehenespenez):

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

Eta kontuaren egoera zure kontu pertsonalean erakutsi behar baduzu, partekatutako blokeoa erabil dezakezu edo ez erabil dezakezu:

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

Hala ere, datu-baseen eragiketak ia berehala egiten direla suposatzen badugu (gogora dezadan globalak erlazio-taula baino askoz ere maila baxuagoko egitura bat direla), orduan maila honen beharra gutxitzen da.

IRAKURKETA ERREPIKATZEA - Isolamendu-maila honek aldibereko transakzioen bidez alda daitezkeen datuen irakurketa anitz egiteko aukera ematen du.

Horren arabera, aldatzen ditugun datuak irakurtzean blokeo partekatua jarri beharko dugu eta aldatzen ditugun datuei blokeo esklusiboak.

Zorionez, LOCK operadoreak beharrezkoak diren blokeo guztiak zehatz-mehatz zerrendatzeko aukera ematen du, eta horietatik asko egon daitezke, adierazpen batean.

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

beste eragiketak (une honetan hari paraleloak ^pertsona(123, zenbatekoa) aldatzen saiatzen dira, baina ezin)

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

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

Komaz bereizitako blokeoak zerrendatzean, sekuentzialki hartzen dira, baina hau egiten baduzu:

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

gero atomikoki hartzen dira aldi berean.

serialize — blokeoak ezarri beharko ditugu, azken finean, datu komunak dituzten transakzio guztiak sekuentzialki exekutatu daitezen. Planteamendu honetarako, blokeo gehienak esklusiboak izan behar dira eta errendimendurako globalaren eremu txikienetan hartu behar dira.

^Pertsona globalaren funtsak zorduntzeari buruz hitz egiten badugu, SERIALIZE isolamendu-maila baino ez da onargarria horretarako, dirua zorrozki sekuentzialki gastatu behar baita, bestela posible da kopuru bera hainbat aldiz gastatzea.

4. Iraunkortasuna

Ontzia gogor ebakitzeko probak egin nituen erabiliz

docker kill my-iris

Oinarriak ondo jasaten zituen. Ez zen arazorik identifikatu.

Ondorioa

Mundu mailakoentzat, InterSystems IRISek transakzioen laguntza du. Benetan atomikoak eta fidagarriak dira. Globaletan oinarritutako datu-base baten koherentzia bermatzeko, programatzaileen ahaleginak eta transakzioen erabilera beharrezkoak dira, ez baitu barne-eraikuntza konplexurik, esate baterako, kanpoko gakoak.

Blokeoak erabili gabe globalen isolamendu-maila IRAKURRI GABE KONPROMISOA da, eta blokeoak erabiltzean SERIALIZE mailaraino berma daiteke.

Globalen transakzioen zuzentasuna eta abiadura programatzailearen trebetasunaren araberakoa da oso: zenbat eta gehiago partekatzen diren blokeoak irakurtzean, orduan eta isolamendu maila altuagoa izango da eta zenbat eta blokeo esklusiboagoak hartu, orduan eta azkarragoa izango da errendimendua.

Iturria: www.habr.com

Gehitu iruzkin berria