{"id":36650,"date":"2019-10-31T22:12:54","date_gmt":"2019-10-31T19:12:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/tranzaktsii-v-globalah-intersystems-iris\/"},"modified":"2019-10-31T22:12:54","modified_gmt":"2019-10-31T19:12:54","slug":"tranzaktsii-v-globalah-intersystems-iris","status":"publish","type":"post","link":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transaksjonar i globalar InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transaksjonar i globalar InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>DBMS InterSystems IRIS st\u00f8ttar interessante strukturar for datalagring \u2014 globalar. I utgangspunktet er dette flerniv\u00e5-n\u00f8kklar med ulike ekstra funksjonar som transaksjonar, raske funksjonar for \u00e5 navigere i datatr\u00e6r, l\u00e5sing, og sitt eige spr\u00e5k, ObjectScript.<\/p>\n<p>Les meir om globalar i artikkelen \u00abGlobalar \u2014 sverd og skjold for datalagring\u00bb:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Tr\u00e6r. Del 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Tr\u00e6r. Del 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Sparsomme matriser. Del 3<\/a><\/noindex><\/p>\n<p>Eg vart nysgjerrig p\u00e5 korleis transaksjonar er implementert i globalar, og kva som gjer desse strukturane unike. Det er ein heilt annan m\u00e5te \u00e5 lagre data p\u00e5 enn dei vante tabellane. Mye meir l\u00e5g-niv\u00e5.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSom kjent fr\u00e5 teorien om relasjonsdatabasar, b\u00f8r ein god implementering av transaksjonar oppfylle krava <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomic (atomaritet).<\/b> Alle endringar som er gjort i transaksjonen skal registrerast, eller inga endring skal gjerast.<\/p>\n<p><b>C \u2014 Consistency (konsistens).<\/b> Etter at transaksjonen er fullf\u00f8rt, m\u00e5 den logiske tilstanden til databasen vere internt konsistent. Dette kravet ang\u00e5r i stor grad programmaren, men i tilfelle av SQL-databasar, er det ogs\u00e5 knytt til utanlandske n\u00f8klar.<\/p>\n<p><b>I \u2014 Isolate (isolasjon).<\/b> Parallelt utf\u00f8rte transaksjonar skal ikkje p\u00e5verke kvarandre.<\/p>\n<p><b>D \u2014 Durable (varigheit).<\/b> Etter vellykka avslutning av transaksjonen, skal problem p\u00e5 lavare niv\u00e5 (for eksempel str\u00f8msvikt) ikkje p\u00e5verke data som er endra av transaksjonen.<\/p>\n<p>Globalar er ikkje-relasjonelle datastrukturar. Dei vart utvikla for ekstrem rask drifting p\u00e5 sv\u00e6rt avgrensa maskinvare. La oss sj\u00e5 n\u00e6rare p\u00e5 implementasjonen av transaksjonar i globalar ved hjelp av <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">den offisielle docker-bilete av IRIS<\/a><\/noindex>.<\/p>\n<p>For \u00e5 st\u00f8tte transaksjonar i IRIS, blir f\u00f8lgjande kommandoar brukte: <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.intersystems.com\/irislatest\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_ctstart\">TSTART<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.intersystems.com\/irislatest\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_ctcommit\">TCOMMIT<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.intersystems.com\/irislatest\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_ctrollback\">TROLLBACK<\/a><\/noindex>.<\/p>\n<h2>1. Atomaritet<\/h2>\n<p>\nDet er lettast \u00e5 sjekke atomaritet. Vi sjekkar fr\u00e5 databasen sin konsoll.<\/p>\n<pre><code class=\"bash\">Kill ^a\nTSTART\nSet ^a(1) = 1\nSet ^a(2) = 2\nSet ^a(3) = 3\nTCOMMIT<\/code><\/pre>\n<p>\nS\u00e5 f\u00e5r vi ut:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nVi f\u00e5r:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nAlt i orden. Atomaritet er oppretthaldt: alle endringar er registrert.<\/p>\n<p>La oss gjere oppg\u00e5va meir komplisert, vi introduserer ein feil og sjekkar korleis transaksjonen blir bevart, delvis eller ikkje i det heile.<\/p>\n<p>La oss sjekke atomariteten igjen:<\/p>\n<pre><code class=\"bash\">Kill ^A\nTSTART\nSet ^a(1) = 1\nSet ^a(2) = 2\nSet ^a(3) = 3<\/code><\/pre>\n<p>\nDeretter tvingar vi til \u00e5 stoppe containeren, startar opp igjen og ser kva som skjer. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDenne kommandoen er praktisk talt lik en tvungen str\u00f8mavstengning, da den sender et umiddelbart stoppesignal til prosessen SIGKILL.<\/p>\n<p>Kan det ha v\u00e6rt at transaksjonen ble delvis lagret?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nei, den ble ikke lagret.<\/p>\n<p>La oss pr\u00f8ve tilbakef\u00f8ringskommandoen:<\/p>\n<pre><code class=\"bash\">Kill ^A\nTSTART\nSet ^a(1) = 1\nSet ^a(2) = 2\nSet ^a(3) = 3\nTROLLBACK\n\nWRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\nDet ble heller ikke lagret noe.<\/p>\n<h2>2. Konsistens<\/h2>\n<p>\nSiden i globale databaser blir n\u00f8klene ogs\u00e5 laget p\u00e5 globale niv\u00e5er (la meg minne om at global er en lavere niv\u00e5struktur for datalagring enn en relasjonell tabell), for \u00e5 oppfylle kravene til konsistens m\u00e5 endringen av n\u00f8kkelen inkluderes i den samme transaksjonen som endringen av globalen.<\/p>\n<p>For eksempel har vi en global ^person, der vi lagrer personlige data og bruker identitetsnummeret som n\u00f8kkel.<\/p>\n<pre><code class=\"bash\">^person(1234567, 'firstname') = 'Sergey'\n^person(1234567, 'lastname') = 'Kamenev'\n^person(1234567, 'phone') = '+74995555555\n...<\/code><\/pre>\n<p>\nFor \u00e5 ha rask s\u00f8king etter etternavn og fornavn laget vi n\u00f8kkelen ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nFor at databasen skal v\u00e6re konsistent, m\u00e5 vi legge til personen slik:<\/p>\n<pre><code class=\"bash\">TSTART\n^person(1234567, 'firstname') = 'Sergey'\n^person(1234567, 'lastname') = 'Kamenev'\n^person(1234567, 'phone') = '+74995555555\n^index('Kamenev', 'Sergey', 1234567) = 1\nTCOMMIT<\/code><\/pre>\n<p>\nDermed m\u00e5 vi ogs\u00e5 bruke en transaksjon ved sletting:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nMed andre ord ligger oppfyllelsen av konsistenskravene helt p\u00e5 utviklerens skuldre. Men n\u00e5r det gjelder globale, er dette normalt, p\u00e5 grunn av deres lavniv\u00e5natur.<\/p>\n<h2>3. Isolasjon<\/h2>\n<p>\nHer begynner det \u00e5 bli komplisert. Mange brukere arbeider samtidig med den samme databasen, endrer de samme dataene.<\/p>\n<p>Situasjonen kan sammenlignes med at mange brukere samtidig jobber med det samme kode-repositoriet og pr\u00f8ver \u00e5 commite endringer i mange filer p\u00e5 en gang.<\/p>\n<p>Databasen m\u00e5 h\u00e5ndtere alt dette i sanntid. Gitt at i seri\u00f8se selskaper finnes det til og med en spesialperson som er ansvarlig for versjonskontroll (for \u00e5 sl\u00e5 sammen grener, l\u00f8se konflikter, osv.), og at databasen m\u00e5 gj\u00f8re alt dette i sanntid, blir oppgavens kompleksitet og korrektheten i databasedesign og koden som vedlikeholder den \u00e5penbar.<\/p>\n<p>Databasen kan ikke forst\u00e5 meningen med de handlingene som brukerne utf\u00f8rer for \u00e5 forhindre konflikter n\u00e5r de jobber med de samme dataene. Den kan bare tilbakekalle en transaksjon som strider mot en annen eller utf\u00f8re dem sekvensielt.<\/p>\n<p>Et annet problem er at under utf\u00f8relsen av en transaksjon (f\u00f8r kommittering) kan databasen v\u00e6re i en inkonsekvent tilstand, derfor er det \u00f8nskelig at andre transaksjoner ikke har tilgang til den inkonsekvente tilstanden til databasen, noe som oppn\u00e5s i relasjonsdatabaser p\u00e5 mange m\u00e5ter: ved \u00e5 lage \u00f8yeblikksbilder, ved fleredelelinje og s\u00e5 videre.<\/p>\n<p>N\u00e5r transaksjoner kj\u00f8res parallelt, er det viktig at de ikke forstyrrer hverandre. Dette er egenskapen av isolasjon.<\/p>\n<p>SQL definerer 4 niv\u00e5er av isolasjon:<\/p>\n<ul>\n<li>READ UNCOMMITTED<\/li>\n<li>READ COMMITTED<\/li>\n<li>REPEATABLE READ<\/li>\n<li>SERIALIZABLE<\/li>\n<\/ul>\n<p>\nLa oss se p\u00e5 hvert niv\u00e5 separat. Kostnadene for implementering av hvert niv\u00e5 \u00f8ker nesten eksponentielt.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 dette er det laveste isolasjonsniv\u00e5et, men samtidig det raskeste. Transaksjoner kan lese endringer gjort av hverandre.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 dette er det neste isolasjonsniv\u00e5et, som er et kompromiss. Transaksjoner kan ikke lese endringer gjort av hverandre f\u00f8r kommittering, men kan lese eventuelle endringer gjort etter kommittering.<\/p>\n<p>Hvis vi har en lang transaksjon T1, der det har v\u00e6rt kommitteringer i transaksjonene T2, T3\u2026 Tn, som har arbeidet med de samme dataene som T1, vil vi hver gang vi foresp\u00f8r data i T1 motta ulike resultater. Dette fenomenet kalles ikke-repetert lesing.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 dette isolasjonsniv\u00e5et har vi ikke fenomenet ikke-repetert lesing, fordi for hver foresp\u00f8rsel om \u00e5 lese data opprettes et \u00f8yeblikksbilde av dataresultatet, og n\u00e5r det brukes igjen i denne samme transaksjonen, benyttes dataene fra \u00f8yeblikksbildet. Imidlertid er det p\u00e5 dette isolasjonsniv\u00e5et mulig \u00e5 lese fantomdata. Dette gjelder lesing av nye rader som er lagt til av parallelle bekreftede transaksjoner.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 det h\u00f8yeste isolasjonsniv\u00e5et. Det er preget av det at data som p\u00e5 en eller annen m\u00e5te brukes i transaksjonen (lesing eller endring) blir tilgjengelige for andre transaksjoner f\u00f8rst etter at den f\u00f8rste transaksjonen er fullf\u00f8rt.<\/p>\n<p>F\u00f8rst m\u00e5 vi se p\u00e5 om det er isolasjon av operasjonene i transaksjonen fra hovedstr\u00f8mmen. Vi \u00e5pner 2 terminalvinduer.<\/p>\n<pre><code class=\"bash\">Kill ^t\n\nWrite ^t(1)\n2<\/code><\/pre>\n<pre><code class=\"bash\">\nTSTART\nSet ^t(1)=2<\/code><\/pre>\n<p>\nDet finnes ingen isolasjon. \u00c9n str\u00f8m ser hva den andre som har \u00e5pnet transaksjonen gj\u00f8r.<\/p>\n<p>La oss se om transaksjoner fra forskjellige str\u00f8mmer ser hva som skjer inni dem. <\/p>\n<p>Vi \u00e5pner 2 terminalvinduer og \u00e5pner 2 transaksjoner parallelt.<\/p>\n<pre><code class=\"bash\">kill ^t\nTSTART\nWrite ^t(1)\n3<\/code><\/pre>\n<pre><code class=\"bash\">\nTSTART\nSet ^t(1)=3\n<\/code><\/pre>\n<p>\nParallele transaksjoner ser dataene til hverandre. S\u00e5 vi har f\u00e5tt det enkleste, men ogs\u00e5 raskeste niv\u00e5et av isolasjon, READ UNCOMMITTED.<\/p>\n<p>Dette var i prinsippet \u00e5 forvente for globale variabler, hvor ytelse alltid har v\u00e6rt i fokus. <\/p>\n<p>Hva om vi trenger et h\u00f8yere niv\u00e5 av isolasjon for operasjoner p\u00e5 globale variabler?<\/p>\n<p>Her m\u00e5 vi tenke p\u00e5 hvorfor niv\u00e5er av isolasjon er n\u00f8dvendige og hvordan de fungerer.<\/p>\n<p>Det h\u00f8yeste niv\u00e5et av isolasjon, SERIALIZE, betyr at resultatet av parallelt utf\u00f8rte transaksjoner er ekvivalent med sekvensiell utf\u00f8ring, som garanterer frav\u00e6r av kollisjoner.<\/p>\n<p>Dette kan vi oppn\u00e5 med hensiktsmessige l\u00e5ser i ObjectScript, som har mange forskjellige bruksomr\u00e5der: man kan gj\u00f8re vanlig, inkrementell, eller flere l\u00e5singer med kommandoen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.intersystems.com\/latest\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_clock\">LOCK<\/a><\/noindex>.<\/p>\n<p>Lavere niv\u00e5er av isolasjon er kompromisser laget for \u00e5 \u00f8ke databasehastigheten.<\/p>\n<p>La oss se hvordan vi kan oppn\u00e5 ulike niv\u00e5er av isolasjon med hjelp av l\u00e5ser.<\/p>\n<p>Denne operatoren gj\u00f8r det mulig \u00e5 ta ikke bare eksklusive l\u00e5ser, som er n\u00f8dvendige for \u00e5 endre data, men ogs\u00e5 s\u00e5kalte delte l\u00e5ser, som flere str\u00f8mmer kan ta parallelt n\u00e5r de trenger \u00e5 lese data som ikke skal endres av andre prosesser under lesing.<\/p>\n<p>Mer om tofasel\u00e5singsmetoden p\u00e5 russisk og engelsk:<\/p>\n<p>\u2192 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D1%83%D1%85%D1%84%D0%B0%D0%B7%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0\">Tofasel\u00e5sning<\/a><\/noindex><br \/>\n\u2192 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_locking\">Two-phase locking<\/a><\/noindex><\/p>\n<p>Vanskeligheten er at under transaksjonen kan databasens tilstand v\u00e6re inkonsistent, men disse inkonsistente dataene er synlige for andre prosesser. Hvordan unng\u00e5 dette?<\/p>\n<p>Vi vil lage synsvinduer med l\u00e5ser der databasens tilstand er konsistent. Og all tilgang til slike vinduer med konsistent tilstand vil bli kontrollert av l\u00e5ser.<\/p>\n<p>Delte blokkeringer av de samme dataene er gjenbrukbare \u2014 flere prosesser kan ta dem. Disse blokkeringene forhindrer andre prosesser i \u00e5 endre dataene, dvs. de brukes til \u00e5 danne vinduer av konsistent tilstand i databasen.<\/p>\n<p>Eksklusive blokkeringer brukes for \u00e5 endre data \u2014 en slik blokkering kan kun tas av \u00e9n prosess. En eksklusiv blokkering kan tas av:<\/p>\n<ol>\n<li>Enhver prosess, hvis dataene er frie.<\/li>\n<li>Bare den prosessen som har en delt blokkering p\u00e5 disse dataene og f\u00f8rst har bedt om en eksklusiv blokkering.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transaksjonar i globalar InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJo smalere synsvinduet er, desto lengre m\u00e5 andre prosesser vente, men desto mer konsistent kan tilstanden i databasen v\u00e6re i det.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 essensen av dette niv\u00e5et er at vi bare ser bekreftede data fra andre str\u00f8mmer. Hvis dataene i en annen transaksjon ikke er bekreftet enn\u00e5, ser vi den gamle versjonen.<\/p>\n<p>Dette lar oss parallellisere arbeidet i stedet for \u00e5 vente p\u00e5 at blokkeringen skal frigj\u00f8res.<\/p>\n<p>Uten spesielle triks vil vi ikke kunne se den gamle versjonen av dataene i IRIS, s\u00e5 vi m\u00e5 n\u00f8ye oss med blokkeringer.<\/p>\n<p>Tilsvarende m\u00e5 vi med hjelp av delte blokkeringer tillate lesing av data bare i konsistens\u00f8yeblikkene.<\/p>\n<p>La oss si at vi har en brukerbase ^person som overf\u00f8rer penger til hverandre.<\/p>\n<p>Tidspunktet for overf\u00f8ring fra person 123 til person 242:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123), +^person(242)\nSet ^person(123, amount) = ^person(123, amount) - amount\nSet ^person(242, amount) = ^person(242, amount) + amount\nLOCK -^person(123), -^person(242)<\/code><\/pre>\n<p>\nTidspunktet for foresp\u00f8rselen om hvor mye penger person 123 har f\u00f8r fradrag, m\u00e5 v\u00e6re ledsaget av en eksklusiv blokkering (som standard):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nMen hvis man trenger \u00e5 vise kontobalansen i den personlige kontoen, kan man bruke en delt blokkering eller helt la v\u00e6re \u00e5 bruke den:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nImidlertid, hvis vi antar at operasjoner med databasen utf\u00f8res praktisk talt \u00f8yeblikkelig (jeg minner om at globale variabler er en langt mer lavniv\u00e5struktur enn relasjonsdatabasen), faller behovet for dette niv\u00e5et.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 dette isolasjonsniv\u00e5et er det tillatt at det kan v\u00e6re flere lesinger av data som kan endres av parallelle transaksjoner. <\/p>\n<p>Tilsvarende m\u00e5 vi sette en delt blokkering p\u00e5 dataene vi endrer og eksklusive blokkeringer p\u00e5 dataene vi endrer.<\/p>\n<p>Operatoren LOCK gj\u00f8r det mulig \u00e5 detaljere alle n\u00f8dvendige l\u00e5ser i \u00e9n enkelt operator, som kan v\u00e6re mange.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nlesing av ^person(123, amount)<\/code><\/pre>\n<p>\nandre operasjoner (mens parallelle str\u00f8mmer pr\u00f8ver \u00e5 endre ^person(123, amount), men ikke kan)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nendre ^person(123, amount)\nLOCK -^person(123, amount)\n\nlesing av ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nVed \u00e5 liste opp l\u00e5ser med komma tas de sekvensielt, men hvis vi gj\u00f8r det slik:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\ntas de atom\u00e6rt alle samtidig.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 vi m\u00e5 sette opp l\u00e5ser slik at til slutt alle transaksjoner som har felles data utf\u00f8res sekvensielt. For denne tiln\u00e6rmingen m\u00e5 de fleste l\u00e5ser v\u00e6re eksklusive og tas p\u00e5 de minste omr\u00e5dene av globalen for ytelse.<\/p>\n<p>N\u00e5r det gjelder uttak av midler i globalen ^person, er det kun SERIALIZE-isolasjonsniv\u00e5et som er akseptabelt, siden penger m\u00e5 brukes strengt sekvensielt, ellers kan man risikere \u00e5 bruke den samme summen flere ganger.<\/p>\n<h2>4. Varighet<\/h2>\n<p>\nJeg har utf\u00f8rt tester med hard nedstengning av containeren ved hjelp av<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDatabasen h\u00e5ndterte dette godt. Det ble ikke oppdaget noen problemer.<\/p>\n<h2>Konklusjon<\/h2>\n<p>\nFor globaler i InterSystems IRIS er det st\u00f8tte for transaksjoner. De er faktisk atom\u00e6re, p\u00e5litelige. For \u00e5 sikre konsistensen i databasen p\u00e5 globaler er det n\u00f8dvendig med programmererens innsats og bruk av transaksjoner, da det ikke er komplekse innebygde konstruksjoner som fremmedn\u00f8kler.<\/p>\n<p>Isolasjonsniv\u00e5et for globaler uten bruk av l\u00e5ser er READ UNCOMMITED, og ved bruk av l\u00e5ser kan det sikres opp til SERIALIZE-niv\u00e5et.<\/p>\n<p>Korrekthet og hastighet p\u00e5 transaksjoner i globaler avhenger sterkt av programmererens dyktighet: jo mer omfattende shared-l\u00e5ser brukes under lesing, desto h\u00f8yere er isolasjonsniv\u00e5et, og jo smalere eksklusive l\u00e5ser brukes, desto bedre ytelse.<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461753\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044b. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 ObjectScript. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u00ab\u0413\u043b\u043e\u0431\u0430\u043b\u044b \u2014 \u043c\u0435\u0447\u0438-\u043a\u043b\u0430\u0434\u0435\u043d\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\u00bb: \u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 1 \u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 2 \u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0427\u0430\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27448,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36650","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 InterSystems IRIS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:12:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:12:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Transaksjoner i globaler InterSystems IRIS | ProHoster","description":"Databasen InterSystems IRIS st\u00f8tter interessante strukturer.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 InterSystems IRIS | ProHoster","og:description":"\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.","og:url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:12:54+00:00","article:modified_time":"2019-10-31T19:12:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36650","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:17:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:41:52","updated":"2026-01-22 04:17:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}