{"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\/hu\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Tranzakci\u00f3k az InterSystems IRIS glob\u00e1lison","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tranzakci\u00f3k az InterSystems IRIS glob\u00e1lison\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Az InterSystems IRIS DBMS olyan \u00e9rdekes strukt\u00far\u00e1kat t\u00e1mogat az adatok t\u00e1rol\u00e1s\u00e1ra, mint a glob\u00e1lisok. Ezek l\u00e9nyeg\u00e9ben t\u00f6bbszint\u0171 kulcsok k\u00fcl\u00f6nf\u00e9le extra funkci\u00f3kkal, mint a tranzakci\u00f3k, gyors funkci\u00f3k az adatf\u00e1k bej\u00e1r\u00e1s\u00e1hoz, z\u00e1rol\u00e1sok \u00e9s saj\u00e1t ObjectScript nyelv.<\/p>\n<p>Tov\u00e1bbi inform\u00e1ci\u00f3 a glob\u00e1lisokr\u00f3l a \"Glob\u00e1lisok \u2014 az adatok t\u00e1rol\u00e1s\u00e1nak var\u00e1zsp\u00e1lc\u00e1i\" c\u00edm\u0171 cikksorozatban:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">F\u00e1k. 1. r\u00e9sz<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">F\u00e1k. 2. r\u00e9sz<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">S\u0171r\u00edtett t\u00f6mb\u00f6k. 3. r\u00e9sz<\/a><\/noindex><\/p>\n<p>\u00c9rdekesnek tal\u00e1lom, hogy a glob\u00e1lisokban hogyan val\u00f3sulnak meg a tranzakci\u00f3k, \u00e9s milyen saj\u00e1tos jellemz\u0151ik vannak. Ez teljesen elt\u00e9r a megszokott t\u00e1bl\u00e1zatos adatszerkezett\u0151l. Sokkal alacsonyabb szint\u0171.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nA rel\u00e1lis adatb\u00e1zisok elm\u00e9let\u00e9b\u0151l j\u00f3l ismert, hogy egy j\u00f3 tranzakci\u00f3s megval\u00f3s\u00edt\u00e1snak meg kell felelnie a k\u00f6vetkez\u0151 k\u00f6vetelm\u00e9nyeknek: <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomic (atomoss\u00e1g).<\/b> Minden tranzakci\u00f3val v\u00e9grehajtott v\u00e1ltoztat\u00e1snak r\u00f6gz\u00edtve kell lennie, vagy egy\u00e1ltal\u00e1n semminek.<\/p>\n<p><b>C \u2014 Consistency (konzisztencia).<\/b> A tranzakci\u00f3 befejez\u00e9se ut\u00e1n az adatb\u00e1zis logikai \u00e1llapot\u00e1nak bels\u0151leg ellentmond\u00e1s n\u00e9lk\u00fcl kell lennie. Ez a k\u00f6vetelm\u00e9ny nagyban a programoz\u00f3t \u00e9rinti, de SQL adatb\u00e1zisok eset\u00e9n a k\u00fcls\u0151 kulcsokra is vonatkozik.<\/p>\n<p><b>I \u2014 Isolate (izol\u00e1ci\u00f3).<\/b> A p\u00e1rhuzamosan v\u00e9grehajtott tranzakci\u00f3knak nem szabad hat\u00e1ssal lenni\u00fck egym\u00e1sra.<\/p>\n<p><b>D \u2014 Durable (tart\u00f3ss\u00e1g).<\/b> A tranzakci\u00f3 sikeres befejez\u00e9se ut\u00e1n az als\u00f3bb szint\u0171 probl\u00e9m\u00e1knak (p\u00e9ld\u00e1ul \u00e1ramkimarad\u00e1s) nem szabad hat\u00e1ssal lenni\u00fck a tranzakci\u00f3 \u00e1ltal m\u00f3dos\u00edtott adatokra.<\/p>\n<p>A glob\u00e1lisok nem rel\u00e1ci\u00f3s adatstrukt\u00far\u00e1k. \u0150ket ultrav\u00e1ltozatos teljes\u00edtm\u00e9ny\u0171, nagyon korl\u00e1tozott hardveren val\u00f3 munk\u00e1ra tervezt\u00e9k. N\u00e9zz\u00fck meg a tranzakci\u00f3k megval\u00f3s\u00edt\u00e1s\u00e1t a glob\u00e1lisokban az <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">IRIS hivatalos docker-k\u00e9p\u00e9nek seg\u00edts\u00e9g\u00e9vel<\/a><\/noindex>.<\/p>\n<p>A tranzakci\u00f3k t\u00e1mogat\u00e1s\u00e1hoz IRIS-ben a k\u00f6vetkez\u0151 parancsokat haszn\u00e1lj\u00e1k: <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. Atomoss\u00e1g<\/h2>\n<p>\nAz atomoss\u00e1g legk\u00f6nnyebben tesztelhet\u0151. Ellen\u0151rizz\u00fck az adatb\u00e1zis konzolj\u00e1b\u00f3l.<\/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>\nAzt\u00e1n kiadunk:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nEz a k\u00f6vetkez\u0151ket adja:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nMinden rendben. Az atomoss\u00e1g biztos\u00edtva van: minden v\u00e1ltoztat\u00e1s r\u00f6gz\u00edtve lett.<\/p>\n<p>Neh\u00e9zz\u00e9 tessz\u00fck a feladatot, hib\u00e1t vezet\u00fcnk be, \u00e9s megn\u00e9zz\u00fck, hogyan marad a tranzakci\u00f3, r\u00e9szben vagy egy\u00e1ltal\u00e1n nem.<\/p>\n<p>\u00dajra ellen\u0151rizz\u00fck az atomoss\u00e1got:<\/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>\nAzt\u00e1n k\u00e9nyszer\u00edtve le\u00e1ll\u00edtjuk a kont\u00e9nert, \u00fajraind\u00edtjuk, \u00e9s megn\u00e9zz\u00fck. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nEz a parancs gyakorlatilag egyen\u00e9rt\u00e9k\u0171 az \u00e1ramell\u00e1t\u00e1s k\u00e9nyszer\u00edtett megszak\u00edt\u00e1s\u00e1val, mivel azonnali le\u00e1ll\u00edt\u00f3 jelet (SIGKILL) k\u00fcld.<\/p>\n<p>Lehet, hogy a tranzakci\u00f3 r\u00e9szlegesen megmaradt?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nem, nem maradt meg.<\/p>\n<p>Pr\u00f3b\u00e1ljuk ki a visszavon\u00f3 parancsot:<\/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>\nSzint\u00e9n semmi nem maradt meg.<\/p>\n<h2>2. Konzisztencia<\/h2>\n<p>\nMivel a glob\u00e1lis adatb\u00e1zisokban a kulcsok szint\u00e9n glob\u00e1lis szinten k\u00e9sz\u00fclnek (eml\u00e9kezz\u00fcnk, hogy a glob\u00e1lis egy alacsonyabb szint\u0171 adatstrukt\u00fara a rel\u00e1ci\u00f3s t\u00e1bl\u00e1khoz k\u00e9pest), a konzisztencia k\u00f6vetelm\u00e9ny\u00e9nek teljes\u00edt\u00e9se \u00e9rdek\u00e9ben a kulcs m\u00f3dos\u00edt\u00e1s\u00e1t ugyanabba a tranzakci\u00f3ba kell foglalni, mint a glob\u00e1lis m\u00f3dos\u00edt\u00e1s\u00e1t.<\/p>\n<p>P\u00e9ld\u00e1ul van egy glob\u00e1lis ^person, ahol a szem\u00e9lyi adatokat t\u00e1roljuk, \u00e9s a kulcsunk a TAJ sz\u00e1m.<\/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>\nAhhoz, hogy gyorsan kereshess\u00fcnk vezet\u00e9kn\u00e9v \u00e9s keresztn\u00e9v alapj\u00e1n, l\u00e9trehoztunk egy ^index kulcsot.<\/p>\n<pre><code class=\"bash\">^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1<\/code><\/pre>\n<p>\nAhhoz, hogy az adatb\u00e1zis konzisztens legyen, a szem\u00e9lyi adatokat \u00edgy kell hozz\u00e1adnunk:<\/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>\nEnnek megfelel\u0151en t\u00f6rl\u00e9skor is tranzakci\u00f3t kell haszn\u00e1lnunk:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nM\u00e1s sz\u00f3val a konzisztencia k\u00f6vetelm\u00e9ny\u00e9nek teljes\u00edt\u00e9se teljes m\u00e9rt\u00e9kben a programoz\u00f3 v\u00e1ll\u00e1n nyugszik. De amikor glob\u00e1lisokr\u00f3l van sz\u00f3 \u2013 ez norm\u00e1lis, alacsony szint\u0171 term\u00e9szet\u00fck miatt.<\/p>\n<h2>3. Izol\u00e1lts\u00e1g<\/h2>\n<p>\nItt kezd\u0151dnek a bonyodalmak. Sok felhaszn\u00e1l\u00f3 dolgozik egyszerre ugyanazon az adatb\u00e1zison, m\u00f3dos\u00edtva ugyanazokat az adatokat.<\/p>\n<p>A helyzet \u00f6sszehasonl\u00edthat\u00f3 azzal, amikor sok felhaszn\u00e1l\u00f3 egyszerre dolgozik ugyanazon k\u00f3drepositoryn, \u00e9s pr\u00f3b\u00e1lnak egyszerre sok f\u00e1jlban v\u00e1ltoztat\u00e1sokat elk\u00f6vetni.<\/p>\n<p>Az adatb\u00e1zisnak mindezt val\u00f3s id\u0151ben kell kezelnie. Figyelembe v\u00e9ve, hogy a komolyabb c\u00e9gekn\u00e9l van egy speci\u00e1lis ember, aki a verzi\u00f3kezel\u00e9s\u00e9rt felel (\u00e1gak egyes\u00edt\u00e9se, konfliktusok megold\u00e1sa stb.), \u00e9s az adatb\u00e1zisnak mindezt val\u00f3s id\u0151ben kell tennie, nyilv\u00e1nval\u00f3v\u00e1 v\u00e1lik a feladat bonyolults\u00e1ga \u00e9s az adatb\u00e1zis helyes tervez\u00e9s\u00e9nek sz\u00fcks\u00e9gess\u00e9ge, valamint a hozz\u00e1 kapcsol\u00f3d\u00f3 k\u00f3dnak.<\/p>\n<p>Az adatb\u00e1zis nem k\u00e9pes meg\u00e9rteni a felhaszn\u00e1l\u00f3k \u00e1ltal v\u00e9grehajtott m\u0171veletek jelent\u00e9s\u00e9t a konfliktusok elker\u00fcl\u00e9se \u00e9rdek\u00e9ben, ha azok ugyanazon adatokon dolgoznak. Csak egy tranzakci\u00f3t tud visszavonni, amely ellentmond egy m\u00e1siknak, vagy ezeket sorban v\u00e9grehajtani.<\/p>\n<p>Egy m\u00e1sik probl\u00e9ma, hogy a tranzakci\u00f3 v\u00e9grehajt\u00e1sa sor\u00e1n (a commit el\u0151tt) az adatb\u00e1zis \u00e1llapota inkonzisztens lehet, ez\u00e9rt aj\u00e1nlott, hogy m\u00e1s tranzakci\u00f3k ne f\u00e9rhessenek hozz\u00e1 az inkonzisztens adatb\u00e1zis \u00e1llapothoz, ami rel\u00e1ci\u00f3s adatb\u00e1zisokban sokf\u00e9le m\u00f3don val\u00f3s\u00edthat\u00f3 meg: snapshotok l\u00e9trehoz\u00e1sa, t\u00f6bb verzi\u00f3s sorok stb.<\/p>\n<p>P\u00e1rhuzamos tranzakci\u00f3k v\u00e9grehajt\u00e1sa sor\u00e1n fontos, hogy ne zavarj\u00e1k egym\u00e1st. Ez az izol\u00e1ci\u00f3s tulajdons\u00e1g.<\/p>\n<p>Az SQL n\u00e9gy izol\u00e1ci\u00f3s szintet hat\u00e1roz meg:<\/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>\nTekints\u00fck meg mindegyik szintet k\u00fcl\u00f6n-k\u00fcl\u00f6n. A megval\u00f3s\u00edt\u00e1s k\u00f6lts\u00e9gei majdnem exponenci\u00e1lisan n\u00f6vekednek.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 ez a legalacsonyabb izol\u00e1ci\u00f3s szint, de egyben a leggyorsabb is. A tranzakci\u00f3k olvashatj\u00e1k egym\u00e1s \u00e1ltal v\u00e9grehajtott m\u00f3dos\u00edt\u00e1sokat.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 ez a k\u00f6vetkez\u0151 izol\u00e1ci\u00f3s szint, amely kompromisszumnak sz\u00e1m\u00edt. A tranzakci\u00f3k nem olvashatj\u00e1k egym\u00e1s \u00e1ltal v\u00e9grehajtott m\u00f3dos\u00edt\u00e1sokat a commit el\u0151tt, de olvashatj\u00e1k azokat a m\u00f3dos\u00edt\u00e1sokat, amelyeket a commit ut\u00e1n hajtottak v\u00e9gre.<\/p>\n<p>Ha van egy hossz\u00fa T1 tranzakci\u00f3nk, amely alatt commitok t\u00f6rt\u00e9nnek a T2, T3 \u2026 Tn tranzakci\u00f3kban, amelyek ugyanazokkal az adatokkal dolgoznak, mint a T1, akkor az T1 adatlek\u00e9r\u00e9se sor\u00e1n mindig elt\u00e9r\u0151 eredm\u00e9nyt kapunk. Ezt a jelens\u00e9get nem ism\u00e9telhet\u0151 olvas\u00e1snak h\u00edvj\u00e1k.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 ebben az izol\u00e1ci\u00f3s szintben nincs nem ism\u00e9telhet\u0151 olvas\u00e1s jelens\u00e9ge, mivel minden adatlek\u00e9r\u00e9si k\u00e9r\u00e9shez adatsnapshotot k\u00e9sz\u00edtenek, \u00e9s a tranzakci\u00f3 sor\u00e1n a snapshotb\u00f3l sz\u00e1rmaz\u00f3 adatokat haszn\u00e1lj\u00e1k. Azonban ebben az izol\u00e1ci\u00f3s szintben lehets\u00e9ges a fantom adatok olvas\u00e1sa. Ez alatt a p\u00e1rhuzamosan befejezett tranzakci\u00f3k \u00e1ltal hozz\u00e1adott \u00faj sorok olvas\u00e1s\u00e1t \u00e9rtj\u00fck.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 a legmagasabb izol\u00e1ci\u00f3s szint. Az jellemzi, hogy a tranzakci\u00f3ban b\u00e1rmilyen m\u00f3don haszn\u00e1lt (olvasott vagy m\u00f3dos\u00edtott) adatok m\u00e1s tranzakci\u00f3k sz\u00e1m\u00e1ra csak az els\u0151 tranzakci\u00f3 befejez\u00e9se ut\u00e1n v\u00e1lnak el\u00e9rhet\u0151v\u00e9.<\/p>\n<p>El\u0151sz\u00f6r n\u00e9zz\u00fck meg, van-e m\u0171veletek izol\u00e1l\u00e1sa a tranzakci\u00f3n bel\u00fcl a f\u0151 sz\u00e1lb\u00f3l. Nyissunk meg 2 termin\u00e1lablakot.<\/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>\nNincs izol\u00e1ci\u00f3. Az egyik sz\u00e1l l\u00e1tja, mit csin\u00e1l a m\u00e1sik, aki megnyitotta a tranzakci\u00f3t.<\/p>\n<p>N\u00e9zz\u00fck meg, hogy a k\u00fcl\u00f6nb\u00f6z\u0151 sz\u00e1lak tranzakci\u00f3i l\u00e1tj\u00e1k-e, mi t\u00f6rt\u00e9nik benn\u00fck. <\/p>\n<p>Nyissunk meg 2 termin\u00e1lablakot, \u00e9s p\u00e1rhuzamosan nyissunk meg 2 tranzakci\u00f3t.<\/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>\nA p\u00e1rhuzamos tranzakci\u00f3k l\u00e1tj\u00e1k egym\u00e1s adatait. \u00cdgy a leg egyszer\u0171bb, de leggyorsabb izol\u00e1ci\u00f3s szintet, a READ UNCOMMITTED-et kaptuk.<\/p>\n<p>Ezt alapvet\u0151en v\u00e1rhattuk a glob\u00e1lis adatokn\u00e1l, ahol a sebess\u00e9g mindig kiemelt szerepet j\u00e1tszott. <\/p>\n<p>Mi a teend\u0151, ha magasabb izol\u00e1ci\u00f3s szintre van sz\u00fcks\u00e9g\u00fcnk a glob\u00e1lis m\u0171veletekben?<\/p>\n<p>Itt \u00e9rdemes elgondolkodni, mi\u00e9rt is sz\u00fcks\u00e9gesek az izol\u00e1ci\u00f3s szintek \u00e9s hogyan m\u0171k\u00f6dnek.<\/p>\n<p>A legmagasabb izol\u00e1ci\u00f3s szint, a SERIALIZE azt jelenti, hogy a p\u00e1rhuzamosan v\u00e9grehajtott tranzakci\u00f3k eredm\u00e9nye egyen\u00e9rt\u00e9k\u0171 a sorozatos v\u00e9grehajt\u00e1sukkal, garant\u00e1lva a \u00fctk\u00f6z\u00e9sek hi\u00e1ny\u00e1t.<\/p>\n<p>Ezt \u00fagy \u00e9rhetj\u00fck el, hogy tudatosan kezelj\u00fck a z\u00e1rol\u00e1sokat az ObjectScript-ben, amelyeknek sz\u00e1mos, k\u00fcl\u00f6nb\u00f6z\u0151 alkalmaz\u00e1si m\u00f3dja l\u00e9tezik: lehet\u0151s\u00e9g\u00fcnk van norm\u00e1l, inkrement\u00e1lis, vagy t\u00f6bbsz\u00f6r\u00f6s z\u00e1rol\u00e1s v\u00e9grehajt\u00e1s\u00e1ra a <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>Alacsonyabb izol\u00e1ci\u00f3s szintek \u2013 kompromisszumok, amelyek c\u00e9lja a sz\u00e1m\u00edt\u00f3g\u00e9p sebess\u00e9g\u00e9nek n\u00f6vel\u00e9se.<\/p>\n<p>N\u00e9zz\u00fck meg, hogyan \u00e9rhetj\u00fck el a k\u00fcl\u00f6nb\u00f6z\u0151 izol\u00e1ci\u00f3s szinteket z\u00e1rol\u00e1sok seg\u00edts\u00e9g\u00e9vel.<\/p>\n<p>Ez a parancs nemcsak az adatok m\u00f3dos\u00edt\u00e1s\u00e1hoz sz\u00fcks\u00e9ges exkluz\u00edv z\u00e1rol\u00e1sokat enged, hanem \u00fagynevezett megosztott z\u00e1rol\u00e1sokat is, amelyek egyidej\u0171leg t\u00f6bb sz\u00e1l \u00e1ltal is megszerezhet\u0151k, amikor az adatok olvas\u00e1s\u00e1hoz van sz\u00fcks\u00e9g, amelyeket m\u00e1s folyamatok nem m\u00f3dos\u00edthatnak az olvas\u00e1s sor\u00e1n.<\/p>\n<p>Tov\u00e1bbi inform\u00e1ci\u00f3 a k\u00e9ph\u00e1z m\u00f3dszerr\u0151l oroszul \u00e9s angolul:<\/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\">K\u00e9ph\u00e1z z\u00e1rol\u00e1s<\/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>A probl\u00e9ma az, hogy a tranzakci\u00f3 sor\u00e1n az adatb\u00e1zis \u00e1llapota k\u00f6vetkezetlen lehet, azonban ezek az inkonzisztens adatok m\u00e1s folyamatok sz\u00e1m\u00e1ra l\u00e1that\u00f3k. Hogyan lehet ezt elker\u00fclni?<\/p>\n<p>Olyan l\u00e1that\u00f3s\u00e1gi ablakokat hozunk l\u00e9tre z\u00e1rol\u00e1sokkal, amelyekben az adatb\u00e1zis \u00e1llapota k\u00f6vetkezetes lesz. Minden ilyen k\u00f6vetkezetes \u00e1llapothoz val\u00f3 hozz\u00e1f\u00e9r\u00e9st z\u00e1rol\u00e1sok ir\u00e1ny\u00edtanak.<\/p>\n<p>A megosztott z\u00e1rol\u00e1sok ugyanazokhoz az adatokhoz t\u00f6bbsz\u00f6r\u00f6sen is rendelhet\u0151k - t\u00f6bb folyamat is felveheti azokat. Ezek a z\u00e1rol\u00e1sok megakad\u00e1lyozz\u00e1k m\u00e1s folyamatok sz\u00e1m\u00e1ra az adatok m\u00f3dos\u00edt\u00e1s\u00e1t, vagyis azokat a DB konzisztens \u00e1llapot\u00e1nak kialak\u00edt\u00e1s\u00e1ra haszn\u00e1lj\u00e1k.<\/p>\n<p>Az exkluz\u00edv z\u00e1rol\u00e1sokat adatok m\u00f3dos\u00edt\u00e1s\u00e1ra haszn\u00e1lj\u00e1k - ilyen z\u00e1rol\u00e1st csak egyetlen folyamat vehet fel. Exkluz\u00edv z\u00e1rol\u00e1st vehet fel:<\/p>\n<ol>\n<li>B\u00e1rmely folyamat, ha az adatok szabadok.<\/li>\n<li>Csak az a folyamat, amelynek van shared z\u00e1rol\u00e1sa ezekhez az adatokhoz, \u00e9s els\u0151k\u00e9nt k\u00e9rte az exkluz\u00edv z\u00e1rol\u00e1st.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Tranzakci\u00f3k az InterSystems IRIS glob\u00e1lison\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMin\u00e9l sz\u0171kebb a l\u00e1that\u00f3s\u00e1gi ablak, ann\u00e1l hosszabb ideig kell v\u00e1rniuk m\u00e1s folyamatoknak, de ann\u00e1l ink\u00e1bb konzisztens lehet a DB \u00e1llapota benne.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 ezen szint l\u00e9nyege, hogy csak a m\u00e1s folyamatokb\u00f3l lez\u00e1rtak adatait l\u00e1tjuk. Ha egy m\u00e1sik tranzakci\u00f3ban az adatok m\u00e9g nincsenek lez\u00e1rva, akkor annak r\u00e9gi verzi\u00f3j\u00e1t l\u00e1tjuk.<\/p>\n<p>Ez lehet\u0151v\u00e9 teszi sz\u00e1munkra a p\u00e1rhuzamos munk\u00e1t a z\u00e1rol\u00e1sok felold\u00e1s\u00e1nak v\u00e1rakoz\u00e1sa helyett.<\/p>\n<p>Speci\u00e1lis tr\u00fckk\u00f6k n\u00e9lk\u00fcl nem l\u00e1thatjuk az adatok r\u00e9gi verzi\u00f3j\u00e1t az IRIS-ben, ez\u00e9rt z\u00e1rol\u00e1sokra lesz sz\u00fcks\u00e9g\u00fcnk.<\/p>\n<p>Ennek megfelel\u0151en shared z\u00e1rol\u00e1sok seg\u00edts\u00e9g\u00e9vel csak a konzisztenci\u00e1k pillanataiban enged\u00e9lyezhetj\u00fck az adatok olvas\u00e1s\u00e1t.<\/p>\n<p>Tegy\u00fck fel, hogy van egy felhaszn\u00e1l\u00f3i adatb\u00e1zisunk ^person, akik p\u00e9nzt utalnak egym\u00e1snak.<\/p>\n<p>A p\u00e9nz \u00e1tutal\u00e1s\u00e1nak pillanata a 123. \u00e9s a 242. szem\u00e9ly k\u00f6z\u00f6tt:<\/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>\nA 123. szem\u00e9ly p\u00e9nz\u00f6sszeg\u00e9nek lek\u00e9rdez\u00e9se a levon\u00e1s el\u0151tt exkluz\u00edv z\u00e1rol\u00e1st kell, hogy k\u00eds\u00e9rjen (alap\u00e9rtelmezetten):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nHa azonban a sz\u00e1mlakivonat megjelen\u00edt\u00e9se a felhaszn\u00e1l\u00f3i fi\u00f3kban sz\u00fcks\u00e9ges, akkor haszn\u00e1lhatunk shared z\u00e1rol\u00e1st, vagy ak\u00e1r el is hagyhatjuk azt:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nAzonban, ha felt\u00e9telezz\u00fck, hogy az adatb\u00e1zissal v\u00e9gzett m\u0171veletek majdnem azonnal v\u00e9grehajt\u00f3dnak (eml\u00e9keztetem, hogy a glob\u00e1lok egy sokkal alacsonyabb szint\u0171 strukt\u00fara, mint a rel\u00e1ci\u00f3s t\u00e1bl\u00e1zat), akkor ezen szint sz\u00fcks\u00e9gess\u00e9ge cs\u00f6kken.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 ezen a szint\u0171 izol\u00e1ci\u00f3n\u00e1l enged\u00e9lyezett, hogy t\u00f6bb adatolvas\u00e1s is t\u00f6rt\u00e9njen, amelyeket p\u00e1rhuzamos tranzakci\u00f3k m\u00f3dos\u00edthatnak. <\/p>\n<p>Ennek megfelel\u0151en shared z\u00e1rol\u00e1st kell alkalmaznunk az adatok olvas\u00e1s\u00e1hoz, amelyeket m\u00f3dos\u00edtunk, \u00e9s exkluz\u00edv z\u00e1rol\u00e1sokat az adatokra, amelyeket megv\u00e1ltoztatunk.<\/p>\n<p>A LOCK operator allows you to detail all necessary locks within a single operator, which can be numerous.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nreading ^person(123, amount)<\/code><\/pre>\n<p>\nother operations (at this time, parallel streams attempt to modify ^person(123, amount), but cannot)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nmodifying ^person(123, amount)\nLOCK -^person(123, amount)\n\nreading ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nWhen listing locks with commas, they are taken sequentially, but if done like this:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\nthey are taken atomically all at once.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 we will have to set the locks in such a way that ultimately all transactions with shared data are executed sequentially. For this approach, most locks should be exclusive and taken on the smallest areas of the global for performance.<\/p>\n<p>If we talk about withdrawals in the global ^person, only the SERIALIZE isolation level is acceptable, as money must be spent strictly sequentially; otherwise, it is possible to spend the same amount multiple times.<\/p>\n<h2>4. Longevity<\/h2>\n<p>\nI conducted tests with a hard shutdown of the container by<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nThe database handled it well. No issues were identified.<\/p>\n<h2>Z\u00e1r\u00e1s<\/h2>\n<p>\nFor globals in InterSystems IRIS, there is support for transactions. They are truly atomic and reliable. However, to ensure database consistency in globals, programmer effort and the use of transactions are necessary, as it lacks complex built-in constructs like foreign keys.<\/p>\n<p>The isolation level for globals without using locks is READ UNCOMMITTED, but with locks, it can be secured up to the SERIALIZE level.<\/p>\n<p>The correctness and speed of transactions in globals greatly depend on the programmer's skill: the more broadly shared locks are used when reading, the higher the isolation level; the more narrowly exclusive locks are taken, the greater the performance.<br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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\udd47Transactions in globals of InterSystems IRIS | ProHoster","description":"The InterSystems IRIS DBMS supports interesting structures.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}