{"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\/sv\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transaktioner i globala InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transaktioner i globala InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Databashanteraren InterSystems IRIS st\u00f6djer intressanta strukturer f\u00f6r datalagring \u2013 globala variabler. I grunden \u00e4r detta flerniv\u00e5nycklar med olika ytterligare f\u00f6rdelar som transaktioner, snabba funktioner f\u00f6r att navigera i datatr\u00e4d, l\u00e5sningar och sitt eget spr\u00e5k ObjectScript.<\/p>\n<p>Mer om globala variabler i en serie artiklar \"Globala variabler \u2013 sv\u00e4rd och skatter f\u00f6r datalagring\":<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Tr\u00e4d. Del 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Tr\u00e4d. Del 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Sparsamma arrayer. Del 3<\/a><\/noindex><\/p>\n<p>Jag blev nyfiken p\u00e5 hur transaktioner \u00e4r implementerade i globala variabler, vilka s\u00e4rdrag de har. Det \u00e4r ju en helt annan struktur f\u00f6r datalagring \u00e4n de vanliga tabellerna. Mycket mer l\u00e5g niv\u00e5.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSom k\u00e4nt fr\u00e5n teorin om relationsdatabaser ska en bra implementation av transaktioner uppfylla kraven <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2013 Atomic (atom\u00e4r).<\/b> Alla f\u00f6r\u00e4ndringar som g\u00f6rs i en transaktion ska antingen sparas eller inte sparas alls.<\/p>\n<p><b>C \u2013 Consistency (konsekvens).<\/b> Efter avslutandet av en transaktion ska den logiska tillst\u00e5ndet i databasen vara internt konsekvent. Mycket av detta krav ber\u00f6r programmeraren, men i fallet med SQL-databaser handlar det \u00e4ven om fr\u00e4mmande nycklar.<\/p>\n<p><b>I \u2013 Isolate (isolering).<\/b> Parallellt k\u00f6rande transaktioner ska inte p\u00e5verka varandra.<\/p>\n<p><b>D \u2013 Durable (h\u00e5llbarhet).<\/b> Efter att transaktionen framg\u00e5ngsrikt avslutats ska problem p\u00e5 l\u00e4gre niv\u00e5er (som str\u00f6mavbrott, till exempel) inte p\u00e5verka de data som f\u00f6r\u00e4ndrats av transaktionen.<\/p>\n<p>Globala variabler \u00e4r icke-relationella datastrukturer. De skapades f\u00f6r super snabb drift p\u00e5 mycket begr\u00e4nsad h\u00e5rdvara. L\u00e5t oss titta p\u00e5 implementeringen av transaktioner i globala variabler med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">den officiella Docker-bilden f\u00f6r IRIS<\/a><\/noindex>.<\/p>\n<p>F\u00f6r att st\u00f6dja transaktioner i IRIS anv\u00e4nds kommandon: <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. Atom\u00e4ritet<\/h2>\n<p>\nDet \u00e4r enklast att kontrollera atom\u00e4ritet. Vi testar fr\u00e5n databasens konsol.<\/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>\nSedan g\u00f6r vi en utskrift:<\/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>\nAllt \u00e4r i sin ordning. Atom\u00e4ritet \u00e4r uppr\u00e4tth\u00e5llen: alla f\u00f6r\u00e4ndringar har sparats.<\/p>\n<p>L\u00e5t oss komplicera uppgiften, introducera ett fel och titta p\u00e5 hur transaktionen sparas, delvis eller inte alls.<\/p>\n<p>Vi kontrollerar atom\u00e4ritet \u00e4nnu en g\u00e5ng:<\/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>\nD\u00e4refter tvingar vi container att stanna, startar den igen och ser efter. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDet h\u00e4r kommandot \u00e4r praktiskt taget likv\u00e4rdigt med att tvinga avst\u00e4ngning av str\u00f6mmen, eftersom det skickar en SIGKILL-avbrottssignal.<\/p>\n<p>Kan transaktionen ha sparats delvis?<\/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 har inte sparats.<\/p>\n<p>L\u00e5t oss prova \u00e5terst\u00e4llningskommandot:<\/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>\nInte heller har n\u00e5got sparats.<\/p>\n<h2>2. Konsistens<\/h2>\n<p>\nEftersom nycklar i globala databasstrukturer ocks\u00e5 g\u00f6rs p\u00e5 globala niv\u00e5er (kom ih\u00e5g att en global \u00e4r en mer l\u00e5g niv\u00e5 struktur f\u00f6r att lagra data \u00e4n en relationsdatabas), beh\u00f6ver en nyckelf\u00f6r\u00e4ndring ing\u00e5 i samma transaktion som f\u00f6r\u00e4ndringen av den globala, f\u00f6r att uppfylla kravet p\u00e5 konsistens.<\/p>\n<p>Till exempel har vi en global ^person d\u00e4r vi lagrar personuppgifter och anv\u00e4nder Skatteidentifikationsnummer som nyckel.<\/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>\nF\u00f6r att ha en snabb s\u00f6kning efter efternamn och f\u00f6rnamn har vi skapat nyckeln ^index.<\/p>\n<pre><code class=\"bash\">^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1<\/code><\/pre>\n<p>\nF\u00f6r att databasen ska vara konsekvent m\u00e5ste vi l\u00e4gga till personuppgifterna s\u00e5 h\u00e4r:<\/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>\nD\u00e4rf\u00f6r m\u00e5ste vi vid borttagning ocks\u00e5 anv\u00e4nda en transaktion:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nMed andra ord ligger ansvaret f\u00f6r att uppfylla kravet p\u00e5 konsistens helt och h\u00e5llet p\u00e5 programmerarens axlar. Men n\u00e4r det g\u00e4ller globala strukturer \u2014 \u00e4r det normalt, p\u00e5 grund av deras l\u00e5gniv\u00e5natur.<\/p>\n<h2>3. Isolering<\/h2>\n<p>\nH\u00e4r b\u00f6rjar komplexiteten. M\u00e5nga anv\u00e4ndare arbetar samtidigt med samma databas och \u00e4ndrar samma data.<\/p>\n<p>Situationen \u00e4r j\u00e4mf\u00f6rbar med att m\u00e5nga anv\u00e4ndare arbetar samtidigt med samma kodf\u00f6rvar och f\u00f6rs\u00f6ker commitera f\u00f6r\u00e4ndringar i m\u00e5nga filer samtidigt.<\/p>\n<p>Databasen m\u00e5ste hantera allt detta i realtid. Med tanke p\u00e5 att seri\u00f6sa f\u00f6retag till och med har en speciell person som ansvarar f\u00f6r versionkontroll (f\u00f6r sammanslagning av grenar, konfliktl\u00f6sning etc.), och att databaser m\u00e5ste g\u00f6ra allt detta i realtid, blir uppenbar komplexiteten i uppgiften och vikten av korrekt databasdesign samt koden som st\u00f6der den.<\/p>\n<p>En databas kan inte f\u00f6rst\u00e5 inneb\u00f6rden av de \u00e5tg\u00e4rder som anv\u00e4ndarna utf\u00f6r f\u00f6r att f\u00f6rhindra konflikter, om de arbetar med samma data. Den kan bara \u00e5terkalla en transaktion som strider mot en annan eller utf\u00f6ra dem i sekvens.<\/p>\n<p>Ytterligare ett problem \u00e4r att under tiden en transaktion utf\u00f6rs (fram till commit), kan databasens tillst\u00e5nd vara inkonsistent, s\u00e5 det \u00e4r \u00f6nskv\u00e4rt att andra transaktioner inte har tillg\u00e5ng till ett inkonsistent tillst\u00e5nd i databasen, vilket uppn\u00e5s i relationella databaser p\u00e5 m\u00e5nga s\u00e4tt: genom att skapa snapshots, genom multiversionering av rader osv.<\/p>\n<p>Vid parallell k\u00f6rning av transaktioner \u00e4r det viktigt att de inte st\u00f6r varandra. Detta \u00e4r egenskapen av isolation.<\/p>\n<p>SQL definierar 4 niv\u00e5er av isolation:<\/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>\nL\u00e5t oss \u00f6verv\u00e4ga varje niv\u00e5 f\u00f6r sig. Kostnaderna f\u00f6r implementering av varje niv\u00e5 \u00f6kar n\u00e4stan exponentiellt.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 detta \u00e4r den l\u00e4gsta niv\u00e5n av isolation, men samtidigt den snabbaste. Transaktioner kan l\u00e4sa f\u00f6r\u00e4ndringar som har gjorts av varandra.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 detta \u00e4r n\u00e4sta niv\u00e5 av isolation, som \u00e4r en kompromiss. Transaktioner kan inte l\u00e4sa f\u00f6r\u00e4ndringar som har gjorts av varandra fram till commit, men kan l\u00e4sa alla f\u00f6r\u00e4ndringar som gjorts efter commit.<\/p>\n<p>Om vi har en l\u00e5ng transaktion T1, under vilken commits har gjorts i transaktioner T2, T3 \u2026 Tn, som har arbetat med samma data som T1, d\u00e5 kommer vi varje g\u00e5ng vi fr\u00e5gar efter data i T1 att f\u00e5 ett annat resultat. Detta fenomen kallas icke-repetitiv l\u00e4sning.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 denna isolationsniv\u00e5 har vi inget fenomen av icke-repetitiv l\u00e4sning, p\u00e5 grund av att f\u00f6r varje beg\u00e4ran om att l\u00e4sa data skapas en snapshot av resultatdata och n\u00e4r de anv\u00e4nds igen i samma transaktion anv\u00e4nds data fr\u00e5n snapshot. Men p\u00e5 denna isolationsniv\u00e5 \u00e4r det m\u00f6jligt att l\u00e4sa fantomdata. Det avser att l\u00e4sa nya rader som har lagts till av parallella, fixerade transaktioner.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 den h\u00f6gsta niv\u00e5n av isolation. Den k\u00e4nnetecknas av att data som p\u00e5 n\u00e5got s\u00e4tt anv\u00e4nds i transaktionen (l\u00e4sa eller \u00e4ndra) blir tillg\u00e4ngliga f\u00f6r andra transaktioner f\u00f6rst efter att den f\u00f6rsta transaktionen har avslutats.<\/p>\n<p>L\u00e5t oss b\u00f6rja med att f\u00f6rst\u00e5 om det finns n\u00e5gon isolering av operationerna i transaktionen fr\u00e5n huvudfl\u00f6det. Vi \u00f6ppnar 2 terminalf\u00f6nster.<\/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 finns ingen isolering. En tr\u00e5d ser vad den andra som \u00f6ppnat transaktionen g\u00f6r.<\/p>\n<p>L\u00e5t oss se om transaktionerna i olika tr\u00e5dar ser vad som h\u00e4nder inuti dem. <\/p>\n<p>Vi \u00f6ppnar 2 terminalf\u00f6nster och startar 2 transaktioner parallellt.<\/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>\nParallella transaktioner ser varandras data. S\u00e5 vi har f\u00e5tt den enklaste, men ocks\u00e5 den snabbaste niv\u00e5n av isolation READ UNCOMMITTED.<\/p>\n<p>Detta kunde i princip f\u00f6rv\u00e4ntas f\u00f6r globala variabler, d\u00e4r prestanda alltid har satts i f\u00f6rsta rummet. <\/p>\n<p>Vad g\u00f6r vi om vi beh\u00f6ver en h\u00f6gre niv\u00e5 av isolering i operationer p\u00e5 globala variabler?<\/p>\n<p>H\u00e4r beh\u00f6ver vi reflektera \u00f6ver varf\u00f6r niv\u00e5er av isolering alls \u00e4r n\u00f6dv\u00e4ndiga och hur de fungerar.<\/p>\n<p>Den h\u00f6gsta niv\u00e5n av isolering SERIALIZE inneb\u00e4r att resultatet av parallellt k\u00f6rda transaktioner \u00e4r ekvivalent med deras sekventiella utf\u00f6rande, vilket garanterar att det inte uppst\u00e5r kollisioner.<\/p>\n<p>Detta kan vi g\u00f6ra med hj\u00e4lp av intelligenta l\u00e5s i ObjectScript, som har m\u00e5nga olika anv\u00e4ndningsomr\u00e5den: man kan g\u00f6ra vanliga, inkrementella eller flerl\u00e5sningskommandon med <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>L\u00e4gre niv\u00e5er av isolering \u00e4r kompromisser som syftar till att \u00f6ka databasens prestanda.<\/p>\n<p>L\u00e5t oss se hur vi kan uppn\u00e5 olika niv\u00e5er av isolering med hj\u00e4lp av l\u00e5s.<\/p>\n<p>Denna operator till\u00e5ter att ta inte bara exklusiva l\u00e5s, som beh\u00f6vs f\u00f6r att \u00e4ndra data, utan ocks\u00e5 s\u00e5 kallade delade l\u00e5s, som kan tas av flera tr\u00e5dar parallellt n\u00e4r de beh\u00f6ver l\u00e4sa data som inte f\u00e5r f\u00f6r\u00e4ndras av andra processer under l\u00e4sningen.<\/p>\n<p>Mer om tv\u00e5fasmetoden f\u00f6r l\u00e5sning p\u00e5 ryska och engelska:<\/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\">Tv\u00e5fasl\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>Sv\u00e5righeten ligger i att under transaktionen kan databasens tillst\u00e5nd vara inkonsistent, men dessa inkonsistenta data \u00e4r synliga f\u00f6r andra processer. Hur undviker vi detta?<\/p>\n<p>Vi kommer att skapa s\u00e5dana synf\u00f6nster med l\u00e5s d\u00e4r databasens tillst\u00e5nd kommer att vara konsistent. Och alla \u00e5tkomster till s\u00e5dana synf\u00f6nster med konsistent tillst\u00e5nd kommer att kontrolleras av l\u00e5s.<\/p>\n<p>Delade l\u00e5sningar av samma data \u00e4r \u00e5teranv\u00e4ndbara - de kan tas av flera processer. Dessa l\u00e5sningar f\u00f6rhindrar andra processer fr\u00e5n att \u00e4ndra data, dvs. de anv\u00e4nds f\u00f6r att skapa f\u00f6nster f\u00f6r en \u00f6verenskommen databasstatus.<\/p>\n<p>Exklusiva l\u00e5sningar anv\u00e4nds f\u00f6r att \u00e4ndra data - en s\u00e5dan l\u00e5sning kan endast tas av en process. En exklusiv l\u00e5sning kan tas av:<\/p>\n<ol>\n<li>Vilken som helst process, om data \u00e4r fria<\/li>\n<li>Endast den process som har en shared-l\u00e5sning p\u00e5 dessa data och som f\u00f6rst beg\u00e4rde den exklusiva l\u00e5sningen.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transaktioner i globala InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJu mer begr\u00e4nsad synf\u00e4ltet \u00e4r, desto l\u00e4ngre m\u00e5ste andra processer v\u00e4nta, men desto mer \u00f6verensst\u00e4mmande kan databasens tillst\u00e5nd vara i det.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 k\u00e4rnan i denna niv\u00e5 \u00e4r att vi bara ser de beg\u00e5ngna data fr\u00e5n andra str\u00f6mmar. Om data i en annan transaktion \u00e4nnu inte \u00e4r beg\u00e5ngna ser vi deras gamla version.<\/p>\n<p>Detta g\u00f6r att vi kan parallellisera arbetet ist\u00e4llet f\u00f6r att v\u00e4nta p\u00e5 att l\u00e5sningen ska sl\u00e4ppas.<\/p>\n<p>Utan speciella knep kommer vi inte att kunna se den gamla versionen av data i IRIS, s\u00e5 vi m\u00e5ste klara oss med l\u00e5sningar.<\/p>\n<p>D\u00e4rf\u00f6r m\u00e5ste vi med hj\u00e4lp av shared-l\u00e5sningar till\u00e5ta l\u00e4sning av data endast vid punkter av \u00f6verensst\u00e4mmelse.<\/p>\n<p>Anta att vi har en anv\u00e4ndardatabas ^person, d\u00e4r de \u00f6verf\u00f6r pengar till varandra.<\/p>\n<p>\u00d6verf\u00f6rings\u00f6gonblicket fr\u00e5n person 123 till person 242:<\/p>\n<pre><code class=\"bash\">L\u00c5S +^person(123), +^person(242)\nSt\u00e4ll in ^person(123, amount) = ^person(123, amount) - amount\nSt\u00e4ll in ^person(242, amount) = ^person(242, amount) + amount\nL\u00c5S -^person(123), -^person(242)<\/code><\/pre>\n<p>\n\u00d6gonblicket f\u00f6r att beg\u00e4ra antalet pengar fr\u00e5n person 123 innan debitering m\u00e5ste \u00e5tf\u00f6ljas av en exklusiv l\u00e5sning (som standard):<\/p>\n<pre><code class=\"bash\">L\u00c5S +^person(123)\nSkriv ^person(123)<\/code><\/pre>\n<p>\nOm vi beh\u00f6ver visa kontots status i personligt konto kan vi anv\u00e4nda en shared-l\u00e5sning eller helt skippa den:<\/p>\n<pre><code class=\"bash\">L\u00c5S +^person(123)#\u201dS\u201d\nSkriv ^person(123)<\/code><\/pre>\n<p>\nMen om vi antar att operationer med databasen utf\u00f6rs n\u00e4stan omedelbart (jag noterar att globala \u00e4r en mycket mer l\u00e5g niv\u00e5struktur \u00e4n en relationsdatabas), minskar behovet av denna niv\u00e5.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 p\u00e5 denna isoleringsniv\u00e5 till\u00e5ts att det kan finnas flera l\u00e4sningar av data som kan \u00e4ndras av parallella transaktioner. <\/p>\n<p>D\u00e4rf\u00f6r m\u00e5ste vi s\u00e4tta en shared-l\u00e5sning f\u00f6r att l\u00e4sa data som vi \u00e4ndrar och exklusiva l\u00e5sningar f\u00f6r de data vi f\u00f6r\u00e4ndrar.<\/p>\n<p>Med hj\u00e4lp av LOCK-operat\u00f6ren kan man noggrant ange alla n\u00f6dv\u00e4ndiga l\u00e5s inom en enda operator, eftersom det kan vara v\u00e4ldigt m\u00e5nga.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nl\u00e4sning ^person(123, amount)<\/code><\/pre>\n<p>\nandra operationer (under tiden f\u00f6rs\u00f6ker parallella tr\u00e5dar att \u00e4ndra ^person(123, amount), men kan inte)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\n\u00e4ndra ^person(123, amount)\nLOCK -^person(123, amount)\n\nl\u00e4sning ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nN\u00e4r man listar l\u00e5s med kommatecken tas de i sekvens, men om man g\u00f6r s\u00e5 h\u00e4r:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\ntilldelas de atom\u00e4rt p\u00e5 en g\u00e5ng.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 vi m\u00e5ste st\u00e4lla in l\u00e5sen s\u00e5 att slutligen alla transaktioner som har gemensamma data utf\u00f6rs sekventiellt. F\u00f6r denna metod m\u00e5ste de flesta l\u00e5s vara exklusiva och tas p\u00e5 de minsta omr\u00e5dena i globalen f\u00f6r prestanda.<\/p>\n<p>Om vi talar om uttag av medel i globalen ^person, s\u00e5 \u00e4r endast SERIALIZE-isoleringsniv\u00e5n acceptabel, eftersom pengar m\u00e5ste spenderas strikt sekventiellt, annars kan samma belopp spenderas flera g\u00e5nger.<\/p>\n<h2>4. L\u00e5ngvarighet<\/h2>\n<p>\nJag har genomf\u00f6rt tester med h\u00e5rd avst\u00e4ngning av containern genom<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDatabasen hanterade det bra. Inga problem uppt\u00e4cktes.<\/p>\n<h2>Slutsats<\/h2>\n<p>\nF\u00f6r globalerna i InterSystems IRIS finns st\u00f6d f\u00f6r transaktioner. De \u00e4r verkligen atom\u00e4ra, p\u00e5litliga. F\u00f6r att s\u00e4kerst\u00e4lla databasens konsekvens i globalerna kr\u00e4vs det insatser fr\u00e5n programmerarens sida och anv\u00e4ndning av transaktioner, eftersom det inte finns n\u00e5gra komplexa inbyggda strukturer som externa nycklar.<\/p>\n<p>Isoleringsniv\u00e5n f\u00f6r globalerna utan att anv\u00e4nda l\u00e5s \u00e4r READ UNCOMMITTED, och med anv\u00e4ndning av l\u00e5s kan den uppn\u00e5s \u00e4nda upp till SERIALIZE-niv\u00e5n.<\/p>\n<p>Korrekthet och hastighet f\u00f6r transaktioner p\u00e5 globalerna beror v\u00e4ldigt mycket p\u00e5 programmerarens skicklighet: ju mer som delas av shared-l\u00e5s vid l\u00e4sning, desto h\u00f6gre isoleringsniv\u00e5, och ju mer restriktivt exklusiva l\u00e5s tas, desto b\u00e4ttre prestanda.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 globalerna InterSystems IRIS | ProHoster","description":"DBMS:en InterSystems IRIS st\u00f6der intressanta strukturer.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}