{"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\/da\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transaktioner i globale InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transaktioner i globale InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Databasen InterSystems IRIS underst\u00f8tter nysgerrige strukturer til datalagring \u2014 globale. I bund og grund er det flerniveausn\u00f8gler med forskellige ekstra funktioner som transaktioner, hurtige funktioner til traversal af datatr\u00e6er, l\u00e5sninger og sit eget sprog ObjectScript.<\/p>\n<p>L\u00e6s mere om globale i r\u00e6kken af artikler \"Globale \u2014 sv\u00e6rd-skattekister til datalagring\":<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Tr\u00e6er. Del 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Tr\u00e6er. Del 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Sparsomme arrays. Del 3<\/a><\/noindex><\/p>\n<p>Jeg blev nysgerrig p\u00e5, hvordan transaktioner er implementeret i globale, og hvilke specielle egenskaber de har. For det er en helt anden struktur til datalagring end de velkendte tabeller. Meget mere lavniveau.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSom det er kendt fra teorien om relationelle databaser, skal en god implementering af transaktioner opfylde kravene <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomaritet.<\/b> Alle \u00e6ndringer foretaget i transaktionen skal enten registreres eller ingenting.<\/p>\n<p><b>C \u2014 Konsistens.<\/b> Efter at transaktionen er afsluttet, skal den logiske tilstand af databasen v\u00e6re internt konsistent. I h\u00f8j grad vedr\u00f8rer dette programm\u00f8ren, men i tilf\u00e6lde af SQL-databaser g\u00e6lder det ogs\u00e5 for fremmede n\u00f8gler.<\/p>\n<p><b>I \u2014 Isolation.<\/b> Parallelt udf\u00f8rte transaktioner m\u00e5 ikke p\u00e5virke hinanden.<\/p>\n<p><b>D \u2014 Holdbarhed.<\/b> Efter en succesfuld afslutning af transaktionen m\u00e5 problemer p\u00e5 de lavere niveauer (som str\u00f8msvigt) ikke p\u00e5virke de data, der er \u00e6ndret af transaktionen.<\/p>\n<p>Globale er ikke-relationelle datastrukturer. De blev skabt til ekstremt hurtig drift p\u00e5 meget begr\u00e6nset hardware. Lad os unders\u00f8ge implementeringen af transaktioner i globale ved hj\u00e6lp af <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">den officielle IRIS Docker-image<\/a><\/noindex>.<\/p>\n<p>For at underst\u00f8tte transaktioner i IRIS anvendes kommandoerne: <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 lettest at teste atomaritet. Lad os tjekke fra databasekonsollen.<\/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>\nDerefter laver vi udskriften:<\/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 er i orden. Atomariteten er overholdt: alle \u00e6ndringer blev registreret.<\/p>\n<p>Lad os komplicere opgaven, introducere en fejl og se, hvordan transaktionen bevares, delvist eller slet ikke.<\/p>\n<p>Lad os kontrollere atomariteten igen:<\/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>\nHerefter stopper vi containeren tvungent, genstarter den og ser. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDenne kommando er praktisk talt \u00e6kvivalent med at tvinge str\u00f8mmen fra, da den sender et signal om \u00f8jeblikkelig stop af processen SIGKILL.<\/p>\n<p>Kan det v\u00e6re, at transaktionen er blevet gemt delvist?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nej, den blev ikke gemt.<\/p>\n<p>Lad os pr\u00f8ve rollback-kommandoen:<\/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>\nDer blev heller ikke gemt noget.<\/p>\n<h2>2. Konsistens<\/h2>\n<p>\nDa n\u00f8gler i globale databaser ogs\u00e5 er lavet p\u00e5 globale niveauer (jeg minder om, at en global er en lavere niveau struktur til lagring af data end en relations tabel), skal \u00e6ndringen af n\u00f8glen inkluderes i den samme transaktion som \u00e6ndringen af den globale for at opfylde konsistenskravene.<\/p>\n<p>For eksempel har vi en global ^person, hvor vi opbevarer personoplysninger, og vi bruger CVR nummeret som n\u00f8gle.<\/p>\n<pre><code class=\"bash\">^person(1234567, \u2018firstname\u2019) = \u2018Sergey\u2019\n^person(1234567, \u2018lastname\u2019) = \u2018Kamenev\u2019\n^person(1234567, \u2018phone\u2019) = \u2018+74995555555\n...<\/code><\/pre>\n<p>\nFor at have hurtig s\u00f8gning p\u00e5 efternavn og fornavn har vi lavet n\u00f8glen ^index.<\/p>\n<pre><code class=\"bash\">^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1<\/code><\/pre>\n<p>\nFor at databasen skal v\u00e6re konsistent, skal vi tilf\u00f8je personligheden s\u00e5dan:<\/p>\n<pre><code class=\"bash\">TSTART\n^person(1234567, \u2018firstname\u2019) = \u2018Sergey\u2019\n^person(1234567, \u2018lastname\u2019) = \u2018Kamenev\u2019\n^person(1234567, \u2018phone\u2019) = \u2018+74995555555\n^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1\nTCOMMIT<\/code><\/pre>\n<p>\nTilsvarende skal vi ogs\u00e5 bruge en transaktion ved sletning:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nMed andre ord ligger opfyldelsen af konsistenskravene helt p\u00e5 programm\u00f8rens skuldre. Men n\u00e5r det drejer sig om globale, er det normalt i kraft af deres lavniveau karakt\u00e6r.<\/p>\n<h2>3. Isolering<\/h2>\n<p>\nHer begynder kompleksiteten. Mange brugere arbejder samtidig med den samme database og \u00e6ndrer de samme data.<\/p>\n<p>Situationen kan sammenlignes med, n\u00e5r mange brugere samtidig arbejder med det samme kode-repository og fors\u00f8ger at commite \u00e6ndringer til mange filer samtidigt.<\/p>\n<p>Databasen skal h\u00e5ndtere alt dette i realtid. I betragtning af at st\u00f8rre virksomheder endda har en person der er ansvarlig for versionskontrol (for sammenl\u00e6gning af branches, l\u00f8sning af konflikter osv.), og at databasen skal g\u00f8re alt dette i realtid, bliver opgavens kompleksitet og vigtigheden af korrekt design af databasen og den kode, der underst\u00f8tter den, \u00e5benlys.<\/p>\n<p>Databasen kan ikke forst\u00e5 meningen med de handlinger, som brugerne udf\u00f8rer, for at undg\u00e5 konflikter, hvis de arbejder med de samme data. Den kan kun tilbagekalde \u00e9n transaktion, der modsiger en anden, eller udf\u00f8re dem i r\u00e6kkef\u00f8lge.<\/p>\n<p>Et andet problem er, at under udf\u00f8relsen af en transaktion (f\u00f8r commit), kan database\u72b6\u6001 v\u00e6re inkonsistent, s\u00e5 det er \u00f8nskeligt, at andre transaktioner ikke har adgang til denne inkonsistente tilstand, hvilket opn\u00e5s i relationelle databaser p\u00e5 mange m\u00e5der: gennem snapshot-dannelse, flere versioner af r\u00e6kker osv.<\/p>\n<p>N\u00e5r transaktioner udf\u00f8res parallelt, er det vigtigt, at de ikke forstyrrer hinanden. Det er essensen af isolationsprincippet.<\/p>\n<p>SQL definerer 4 niveauer af isolering:<\/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>\nLad os se p\u00e5 hvert niveau enkeltvis. Omkostningerne ved implementeringen af hvert niveau stiger n\u00e6sten eksponentielt.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 det er det laveste isolationsniveau, men det er samtidig det hurtigste. Transaktioner kan l\u00e6se \u00e6ndringer foretaget af hinanden.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 det er det n\u00e6ste isolationsniveau, som er et kompromis. Transaktioner kan ikke l\u00e6se \u00e6ndringer foretaget af hinanden, f\u00f8r de er blevet committet, men kan l\u00e6se alle \u00e6ndringer foretaget efter commit.<\/p>\n<p>Hvis vi har en lang transaktion T1, hvor der er blevet committet i transaktioner T2, T3 \u2026 Tn, som arbejdede med de samme data som T1, s\u00e5 vil vi hver gang f\u00e5 forskellige resultater, n\u00e5r vi anmoder om data i T1. Dette f\u00e6nomen kaldes ikke-gentagelig l\u00e6sning.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 dette isolationsniveau har vi ikke f\u00e6nomenet med ikke-gentagelig l\u00e6sning, fordi der for hver l\u00e6seforesp\u00f8rgsel oprettes et snapshot af databesvarelsen, og ved gentagen brug i denne samme transaktion anvendes data fra snapshot. Dog er det muligt at l\u00e6se phantomdata p\u00e5 dette isolationsniveau. Dette refererer til at l\u00e6se nye r\u00e6kker, der er tilf\u00f8jet gennem parallelt bekr\u00e6ftede transaktioner.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 det h\u00f8jeste isolationsniveau. Det er kendetegnet ved, at data, der p\u00e5 en eller anden m\u00e5de anvendes i transaktionen (l\u00e6ses eller \u00e6ndres), f\u00f8rst bliver tilg\u00e6ngelige for andre transaktioner, efter den f\u00f8rste transaktion er afsluttet.<\/p>\n<p>Lad os f\u00f8rst finde ud af, om der er isolation af operationer i transaktionen fra hovedtr\u00e5den. Vi \u00e5bner 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>\nDer er ingen isolation. En tr\u00e5d kan se, hvad den anden, der har \u00e5bnet transaktionen, laver.<\/p>\n<p>Lad os se, om transaktioner fra forskellige tr\u00e5de ser, hvad der sker inden i dem. <\/p>\n<p>Vi \u00e5bner 2 terminalvinduer og \u00e5bner 2 transaktioner 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 transaktioner ser data om hinanden. S\u00e5 vi har f\u00e5et det enkleste, men hurtigste niveau af isolation, kaldet READ UNCOMMITTED.<\/p>\n<p>Det var i princippet at forvente for globale variabler, hvor ydeevne altid er i fokus. <\/p>\n<p>Hvad skal vi s\u00e5 g\u00f8re, hvis vi har brug for et h\u00f8jere niveau af isolation i operationer p\u00e5 globale variabler?<\/p>\n<p>Her skal vi overveje, hvorfor vi overhovedet har brug for isolationsniveauer, og hvordan de fungerer.<\/p>\n<p>Det h\u00f8jeste isolationsniveau SERIALIZE betyder, at resultatet af parallelt udf\u00f8rte transaktioner svarer til deres sekventielle udf\u00f8relse, hvilket garanterer, at der ikke er nogle kollisioner.<\/p>\n<p>Dette kan vi g\u00f8re ved hj\u00e6lp af intelligente l\u00e5se i ObjectScript, som har mange forskellige anvendelsesmetoder: vi kan lave almindelig, inkrementel, multipel l\u00e5sning 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 isolationsniveauer er kompromiser, der sigter mod at \u00f8ge databasehastigheden.<\/p>\n<p>Lad os se, hvordan vi kan opn\u00e5 forskellige isolationsniveauer ved hj\u00e6lp af l\u00e5se.<\/p>\n<p>Denne operator tillader ikke kun eksklusive l\u00e5se, som er n\u00f8dvendige for at \u00e6ndre data, men ogs\u00e5 s\u00e5kaldte delte, som kan tages af flere tr\u00e5de parallelt, n\u00e5r de har brug for at l\u00e6se data, der ikke b\u00f8r \u00e6ndres af andre processer under l\u00e6seprocessen.<\/p>\n<p>Mere om to-fase l\u00e5semetoden 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\">To-fase l\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>Problemet er, at databasen kan v\u00e6re i en inkonsistent tilstand under transaktionen, men disse inkonsistente data er synlige for andre processer. Hvordan undg\u00e5r vi det?<\/p>\n<p>Vi vil lave synlighedsvinduer ved hj\u00e6lp af l\u00e5se, hvor databasens tilstand vil v\u00e6re konsistent. Og alle henvendelser til s\u00e5danne synlighedsvinduer med en konsistent tilstand vil blive kontrolleret af l\u00e5se.<\/p>\n<p>Shared-l\u00e5se for de samme data er genanvendelige \u2014 flere processer kan tage dem. Disse l\u00e5se forhindrer andre processer i at \u00e6ndre data, dvs. de bruges til at danne vinduer af konsistent tilstand i databasen.<\/p>\n<p>Eksklusive l\u00e5se bruges til at \u00e6ndre data \u2014 en s\u00e5dan l\u00e5s kan kun tages af \u00e9n proces. En eksklusiv l\u00e5s kan tages af:<\/p>\n<ol>\n<li>Enhver proces, hvis data er frie<\/li>\n<li>Kun den proces, der har en shared-l\u00e5s p\u00e5 disse data og f\u00f8rst anmodede om en eksklusiv l\u00e5s.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transaktioner i globale InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJo smallere synsvinduet er, desto l\u00e6ngere tid skal andre processer vente, men desto mere konsistent kan tilstanden i databasen v\u00e6re i det.<\/p>\n<p><b>READ_COMMITTED<\/b> \u2014 essensen af dette niveau er, at vi kun ser bekr\u00e6ftede data fra andre str\u00f8mme. Hvis data i en anden transaktion endnu ikke er bekr\u00e6ftet, ser vi deres gamle version.<\/p>\n<p>Dette giver os mulighed for at parallelisere arbejdet i stedet for at vente p\u00e5, at l\u00e5sen bliver frigivet.<\/p>\n<p>Uden specielle kneb vil vi ikke kunne se den gamle version af dataene i IRIS, s\u00e5 vi m\u00e5 n\u00f8jes med l\u00e5se.<\/p>\n<p>Dermed skal vi ved hj\u00e6lp af shared-l\u00e5se tillade l\u00e6sning af data kun p\u00e5 tidspunkter med konsistens.<\/p>\n<p>Antag, at vi har en brugerdatabase ^person, der overf\u00f8rer penge til hinanden.<\/p>\n<p>Overf\u00f8rsels\u00f8jeblikket 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>\nOverf\u00f8rselsmomentet, hvor man anmoder om antallet af penge hos person 123 f\u00f8r debitering, skal ledsages af en eksklusiv l\u00e5s (som standard):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nOg hvis man skal vise saldoen i kontrolpanelet, kan man bruge en shared-l\u00e5s eller slet ikke bruge en:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nMen hvis man antager, at operationerne med databasen udf\u00f8res n\u00e6sten \u00f8jeblikkeligt (jeg minder om, at globale er en meget lavere strukturelt niveau end en relationel tabel), s\u00e5 falder behovet for dette niveau.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 dette isolationsniveau tillades det, at der kan v\u00e6re flere l\u00e6sninger af data, der kan \u00e6ndres af parallelle transaktioner. <\/p>\n<p>Dermed skal vi s\u00e6tte shared-l\u00e5se p\u00e5 de data, vi \u00e6ndrer, og eksklusive l\u00e5se p\u00e5 de data, vi \u00e6ndrer.<\/p>\n<p>LOCK-operatoren g\u00f8r det muligt at angive alle n\u00f8dvendige blokeringer detaljeret i \u00e9n operator, hvilket kan blive ret omfattende.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nl\u00e6sning ^person(123, amount)<\/code><\/pre>\n<p>\nandre operationer (i denne periode fors\u00f8ger parallelle tr\u00e5de at \u00e6ndre ^person(123, amount), men kan ikke)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\n\u00e6ndring ^person(123, amount)\nLOCK -^person(123, amount)\n\nl\u00e6sning ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nN\u00e5r blokeringerne angives med komma, tages de sekventielt, og hvis det g\u00f8res s\u00e5dan:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\ntages de atom\u00e6rt alle p\u00e5 \u00e9n gang.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 vi skal sikre, at blokeringerne s\u00e6ttes, s\u00e5 i sidste ende udf\u00f8res alle transaktioner, der har f\u00e6lles data sekventielt. Til denne tilgang skal de fleste blokeringer v\u00e6re eksklusive og tages p\u00e5 de mindste omr\u00e5der af globalen for ydeevne.<\/p>\n<p>Hvis vi taler om udtr\u00e6k af midler i globalen ^person, er kun isolationniveauet SERIALIZE acceptabelt, da penge skal bruges strengt sekventielt, ellers er det muligt at bruge det samme bel\u00f8b flere gange.<\/p>\n<h2>4. Varighed<\/h2>\n<p>\nJeg har udf\u00f8rt tests med h\u00e5rd nedlukning af containeren ved hj\u00e6lp af<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDatabasen klarede det godt. Der blev ikke identificeret problemer.<\/p>\n<h2>Konklusion<\/h2>\n<p>\nFor globaler i InterSystems IRIS er der st\u00f8tte til transaktioner. De er virkelig atomare, p\u00e5lidelige. For at sikre databasens konsistens p\u00e5 globaler kr\u00e6ves det, at programm\u00f8ren g\u00f8r en indsats og bruger transaktioner, da der ikke er komplekse indbyggede konstruktioner som fremmede n\u00f8gler.<\/p>\n<p>Isolationniveauet for globaler uden brug af blokeringer er READ UNCOMMITED, og ved brug af blokeringer kan det opretholdes helt op til niveauet SERIALIZE.<\/p>\n<p>Korrektheden og hastigheden af transaktioner p\u00e5 globaler afh\u00e6nger i h\u00f8j grad af programm\u00f8rens dygtighed: jo mere bredt der anvendes shared-blokeringer ved l\u00e6sning, jo h\u00f8jere er isolationniveauet, og jo strammere eksklusive blokeringer tages, jo bedre bliver ydeevnen.<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.3 - 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\/da\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Transaktioner i globaler InterSystems IRIS | ProHoster","description":"Database management systemet InterSystems IRIS underst\u00f8tter interessante strukturer.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}