{"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\/sk\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transakcie v glob\u00e1loch InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transakcie v glob\u00e1loch InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>DBMS InterSystems IRIS podporuje zauj\u00edmav\u00e9 \u0161trukt\u00fary na uchov\u00e1vanie \u00fadajov \u2014 glob\u00e1ly. V podstate s\u00fa to viac\u00farov\u0148ov\u00e9 k\u013e\u00fa\u010de s r\u00f4znymi \u010fal\u0161\u00edmi funkciami ako s\u00fa transakcie, r\u00fdchle funkcie na prech\u00e1dzanie d\u00e1tov\u00fdmi stromami, z\u00e1mky a vlastn\u00fd jazyk ObjectScript.<\/p>\n<p>Podrobnosti o glob\u00e1loch v s\u00e9rii \u010dl\u00e1nkov \u201eGlob\u00e1ly \u2014 me\u010de-klenoty na uchov\u00e1vanie \u00fadajov\u201c:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Stromy. \u010cas\u0165 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Stromy. \u010cas\u0165 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Riedke polia. \u010cas\u0165 3<\/a><\/noindex><\/p>\n<p>Zauj\u00edmalo ma, ako s\u00fa implementovan\u00e9 transakcie v glob\u00e1loch, ak\u00e9 s\u00fa tam zvl\u00e1\u0161tnosti. Je to predsa \u00faplne in\u00e1 \u0161trukt\u00fara na uchov\u00e1vanie d\u00e1t ne\u017e v\u0161etk\u00fdm zn\u00e1me tabu\u013eky. Omnoho n\u00edzko\u00farov\u0148ovej\u0161ia.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAko je zn\u00e1me z te\u00f3rie rela\u010dn\u00fdch datab\u00e1z, dobr\u00e1 implement\u00e1cia transakci\u00ed by mala sp\u013a\u0148a\u0165 po\u017eiadavky <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomic (atomickos\u0165).<\/b> Zaznamen\u00e1vaj\u00fa sa v\u0161etky zmeny vykonan\u00e9 v transakcii alebo sa neudr\u017eia \u017eiadne.<\/p>\n<p><b>S \u2014 Consistency (konzistentnos\u0165).<\/b> Po dokon\u010den\u00ed transakcie by malo by\u0165 logick\u00e9 stav DB interne konzistentn\u00e9. T\u00e1to po\u017eiadavka sa do ve\u013ekej miery t\u00fdka program\u00e1tora, ale v pr\u00edpade SQL datab\u00e1z sa vz\u0165ahuje aj na vonkaj\u0161ie k\u013e\u00fa\u010de.<\/p>\n<p><b>I \u2014 Isolate (izolovanos\u0165).<\/b> Paralelne vykon\u00e1van\u00e9 transakcie by nemali ovplyv\u0148ova\u0165 jedna druh\u00fa.<\/p>\n<p><b>D \u2014 Durable (trv\u00e1cnos\u0165).<\/b> Po \u00faspe\u0161nom dokon\u010den\u00ed transakcie by probl\u00e9my na ni\u017e\u0161\u00edch \u00farovniach (napr. v\u00fdpadok nap\u00e1jania) nemali ovplyvni\u0165 \u00fadaje zmenen\u00e9 transakciou.<\/p>\n<p>Glob\u00e1ly s\u00fa nerela\u010dn\u00e9 \u0161trukt\u00fary \u00fadajov. Boli vytvoren\u00e9 pre extr\u00e9mne r\u00fdchlu pr\u00e1cu na ve\u013emi obmedzenom hardv\u00e9ri. Po\u010fme presk\u00fama\u0165 realiz\u00e1ciu transakci\u00ed v glob\u00e1loch pomocou <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">ofici\u00e1lneho docker obrazu IRIS<\/a><\/noindex>.<\/p>\n<p>Na podporu transakci\u00ed v IRIS sa pou\u017e\u00edvaj\u00fa pr\u00edkazy: <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. Atomickos\u0165<\/h2>\n<p>\nNajjednoduch\u0161ie je overi\u0165 atomickos\u0165. Skontrolujeme z konzoly datab\u00e1zy.<\/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>\nPotom urob\u00edme v\u00fdstup:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nDostaneme:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nV\u0161etko je v poriadku. Atomickos\u0165 bola dodr\u017ean\u00e1: v\u0161etky zmeny sa ulo\u017eili.<\/p>\n<p>Zlo\u017eme \u00falohu, zave\u010fme chybu a pozrime sa, ako sa transakcia ulo\u017e\u00ed, \u010di \u010diasto\u010dne alebo v\u00f4bec nie.<\/p>\n<p>E\u0161te raz skontrolujeme atomickos\u0165:<\/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>\nPo \u010dom n\u00e1silne zastav\u00edme kontajner, spust\u00edme ho a pozrieme sa. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nTento pr\u00edkaz je prakticky ekvivalentn\u00fd n\u00faten\u00e9mu vypnutiu nap\u00e1jania, preto\u017ee posiela sign\u00e1l na okam\u017eit\u00e9 zastavenie procesu SIGKILL.<\/p>\n<p>M\u00f4\u017ee by\u0165 transakcia ulo\u017een\u00e1 \u010diasto\u010dne?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nie, neulo\u017eila sa.<\/p>\n<p>Vysk\u00fa\u0161ame pr\u00edkaz na vr\u00e1tenie:<\/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>\nTie\u017e sa ni\u010d neulo\u017eilo.<\/p>\n<h2>2. Konzistentnos\u0165<\/h2>\n<p>\nPreto\u017ee v globalizovan\u00fdch datab\u00e1zach s\u00fa k\u013e\u00fa\u010de vytvoren\u00e9 tie\u017e na glob\u00e1lnych entit\u00e1ch (pripom\u00ednam, \u017ee globaliz\u00e1cia je ni\u017e\u0161ia \u0161trukt\u00fara pre ukladanie d\u00e1t ne\u017e rela\u010dn\u00e1 tabu\u013ea), na splnenie po\u017eiadavky konzistentnosti je potrebn\u00e9 zahrn\u00fa\u0165 zmenu k\u013e\u00fa\u010da do tej istej transakcie, ako aj zmenu glob\u00e1lu.<\/p>\n<p>Napr\u00edklad m\u00e1me global ^person, kde uchov\u00e1vame osobn\u00ed a ako k\u013e\u00fa\u010d pou\u017e\u00edvame I\u010cO.<\/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>\nAby sme mali r\u00fdchle vyh\u013ead\u00e1vanie pod\u013ea priezviska a mena, vytvorili sme k\u013e\u00fa\u010d ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nAby bola datab\u00e1za konzistentn\u00e1, mus\u00edme prid\u00e1va\u0165 osobu takto:<\/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>\nOdpovedaj\u00faco, pri odstra\u0148ovan\u00ed mus\u00edme tie\u017e pou\u017ei\u0165 transakciu:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nIn\u00fdmi slovami, splnenie po\u017eiadavky konzistentnosti le\u017e\u00ed \u00faplne na pleciach program\u00e1tora. Ale ke\u010f ide o glob\u00e1ly \u2014 je to v poriadku, vzh\u013eadom na ich n\u00edzku \u00farove\u0148.<\/p>\n<h2>3. Izolovanos\u0165<\/h2>\n<p>\nTu za\u010d\u00ednaj\u00fa \u0165a\u017ekosti. Mnoho pou\u017e\u00edvate\u013eov pracuje s\u00fa\u010dasne s jednou a tou istou datab\u00e1zou, men\u00ed tie ist\u00e9 \u00fadaje.<\/p>\n<p>Situ\u00e1cia sa d\u00e1 prirovna\u0165 k tomu, ke\u010f mnoho pou\u017e\u00edvate\u013eov s\u00fa\u010dasne pracuje s jedn\u00fdm a t\u00fdm ist\u00fdm repozit\u00e1rom s k\u00f3dmi a sna\u017e\u00ed sa naraz commitn\u00fa\u0165 zmeny v mnoh\u00fdch s\u00faboroch.<\/p>\n<p>Datab\u00e1za to v\u0161etko mus\u00ed spracov\u00e1va\u0165 v re\u00e1lnom \u010dase. Zoh\u013ead\u0148uj\u00fac, \u017ee vo v\u00e1\u017enych spolo\u010dnostiach existuje dokonca \u0161peci\u00e1lny \u010dlovek, ktor\u00fd zodpoved\u00e1 za kontrolu verzi\u00ed (za zlu\u010dovanie vetiev, rie\u0161enie konfliktov a podobne), a DB by to v\u0161etko mala robi\u0165 v re\u00e1lnom \u010dase, je zjavn\u00e1 zlo\u017eitost \u00falohy a spr\u00e1vnos\u0165 n\u00e1vrhu datab\u00e1zy a k\u00f3du, ktor\u00fd ju obsluhuje.<\/p>\n<p>Datab\u00e1za nem\u00f4\u017ee pochopi\u0165 v\u00fdznam akci\u00ed vykon\u00e1van\u00fdch pou\u017e\u00edvate\u013emi, aby sa predi\u0161lo konfliktom, ak pracuj\u00fa na t\u00fdch ist\u00fdch \u00fadajoch. M\u00f4\u017ee iba zru\u0161i\u0165 jednu transakciu, ktor\u00e1 je v rozpore s inou, alebo ich vykona\u0165 postupne.<\/p>\n<p>\u010eal\u0161\u00ed probl\u00e9m je, \u017ee po\u010das vykon\u00e1vania transakcie (pred potvrden\u00edm) m\u00f4\u017ee by\u0165 stav datab\u00e1zy nekonzistentn\u00fd, preto je \u017eiaduce, aby ostatn\u00fdm transakci\u00e1m nebol umo\u017enen\u00fd pr\u00edstup k nekonzistentn\u00e9mu stavu datab\u00e1zy, \u010do sa dosahuje v rela\u010dn\u00fdch datab\u00e1zach mnoh\u00fdmi sp\u00f4sobmi: vytv\u00e1ran\u00edm sn\u00edmok, mnohoversn\u00fdmi verziami riadkov at\u010f.<\/p>\n<p>Pri paralelnom vykon\u00e1van\u00ed transakci\u00ed je d\u00f4le\u017eit\u00e9, aby si navz\u00e1jom neprek\u00e1\u017eali. To je vlastnos\u0165 izol\u00e1cie.<\/p>\n<p>SQL definuje 4 \u00farovne izol\u00e1cie:<\/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>\nPresk\u00famame ka\u017ed\u00fa \u00farove\u0148 osobitne. N\u00e1klady na implement\u00e1ciu ka\u017edej \u00farovne rast\u00fa takmer exponenci\u00e1lne.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 to je najni\u017e\u0161ia \u00farove\u0148 izol\u00e1cie, ale z\u00e1rove\u0148 najr\u00fdchlej\u0161ia. Transakcie m\u00f4\u017eu \u010d\u00edta\u0165 zmeny vykonan\u00e9 navz\u00e1jom.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 to je nasleduj\u00faca \u00farove\u0148 izol\u00e1cie, ktor\u00e1 je kompromisom. Transakcie nem\u00f4\u017eu \u010d\u00edta\u0165 zmeny vykonan\u00e9 navz\u00e1jom a\u017e do potvrdenia, ale m\u00f4\u017eu \u010d\u00edta\u0165 ak\u00e9ko\u013evek zmeny vykonan\u00e9 po potvrden\u00ed.<\/p>\n<p>Ak m\u00e1me dlh\u00fa transakciu T1, po\u010das ktorej prebehli potvrdenia v transakci\u00e1ch T2, T3\u2026 Tn, ktor\u00e9 pracovali s t\u00fdmi ist\u00fdmi \u00fadajmi ako T1, pri po\u017eiadavke o \u00fadaje v T1 dostaneme zaka\u017ed\u00fdm in\u00fd v\u00fdsledok. Tento fenom\u00e9n sa ozna\u010duje ako nepov\u0161imnute\u013en\u00e9 \u010d\u00edtanie.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 na tejto \u00farovni izol\u00e1cie nem\u00e1me fenom\u00e9n nepov\u0161imnute\u013en\u00e9ho \u010d\u00edtania, preto\u017ee pre ka\u017ed\u00fd po\u017eiadavok na \u010d\u00edtanie \u00fadajov sa vytv\u00e1ra sn\u00edmka v\u00fdsledn\u00fdch \u00fadajov a pri op\u00e4tovnom pou\u017eit\u00ed v tej istej transakcii sa pou\u017e\u00edvaj\u00fa \u00fadaje zo sn\u00edmky. Av\u0161ak na tejto \u00farovni izol\u00e1cie je mo\u017en\u00e9 \u010d\u00edta\u0165 fant\u00f3mov\u00e9 \u00fadaje. T\u00fdm sa mysl\u00ed \u010d\u00edtanie nov\u00fdch riadkov, ktor\u00e9 boli pridan\u00e9 paraleln\u00fdmi potvrden\u00fdmi transakciami.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 najvy\u0161\u0161ia \u00farove\u0148 izol\u00e1cie. Je charakterizovan\u00e1 t\u00fdm, \u017ee \u00fadaje nejak\u00fdm sp\u00f4sobom pou\u017eit\u00e9 v transakcii (\u010d\u00edtanie alebo zmena) s\u00fa pr\u00edstupn\u00e9 in\u00fdm transakci\u00e1m a\u017e po dokon\u010den\u00ed prvej transakcie.<\/p>\n<p>Na za\u010diatok sa pozrime, \u010di je izol\u00e1cia oper\u00e1ci\u00ed v transakcii od hlavn\u00e9ho toku. Otvor\u00edme 2 okn\u00e1 termin\u00e1lu.<\/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>\nIzol\u00e1cia neexistuje. Jeden tok vid\u00ed, \u010do rob\u00ed druh\u00fd, ktor\u00fd otvoril transakciu.<\/p>\n<p>Pozrime sa, \u010di vidia transakcie r\u00f4znych tokov to, \u010do sa deje v nich. <\/p>\n<p>Otvor\u00edme 2 okn\u00e1 termin\u00e1lu a otvor\u00edme 2 transakcie paralelne.<\/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>\nParaleln\u00e9 transakcie vidia d\u00e1ta navz\u00e1jom. Tak\u017ee sme dostali najjednoduch\u0161iu, ale aj najr\u00fdchlej\u0161iu \u00farove\u0148 izol\u00e1cie READ UNCOMMITTED.<\/p>\n<p>V podstate sa to dalo o\u010dak\u00e1va\u0165 pre glob\u00e1ly, pre ktor\u00e9 sa v\u00fdkon v\u017edy kl\u00e1dol na prv\u00e9 miesto. <\/p>\n<p>\u010co v\u0161ak robi\u0165, ak potrebujeme vy\u0161\u0161iu \u00farove\u0148 izol\u00e1cie v oper\u00e1ci\u00e1ch s glob\u00e1lmi?<\/p>\n<p>Tu je potrebn\u00e9 zamyslie\u0165 sa, pre\u010do vlastne existuj\u00fa \u00farovne izol\u00e1cie a ako funguj\u00fa.<\/p>\n<p>Najvy\u0161\u0161ia \u00farove\u0148 izol\u00e1cie SERIALIZE znamen\u00e1, \u017ee v\u00fdsledok paralelne vykon\u00e1van\u00fdch transakci\u00ed je ekvivalentn\u00fd ich sekven\u010dn\u00e9mu vykonaniu, \u010do zaru\u010duje absenciu kol\u00edzi\u00ed.<\/p>\n<p>Toto m\u00f4\u017eeme dosiahnu\u0165 pomocou spr\u00e1vnych z\u00e1mkov v ObjectScripte, ktor\u00e9 maj\u00fa mno\u017estvo r\u00f4znych sp\u00f4sobov pou\u017eitia: m\u00f4\u017eeme vykon\u00e1va\u0165 oby\u010dajn\u00e9, inkrement\u00e1lne a viacn\u00e1sobn\u00e9 z\u00e1mky pr\u00edkazom <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>Ni\u017e\u0161ie \u00farovne izol\u00e1cie s\u00fa kompromisy, ktor\u00e9 maj\u00fa za cie\u013e zv\u00fd\u0161i\u0165 r\u00fdchlos\u0165 pr\u00e1ce datab\u00e1zy.<\/p>\n<p>Pozrime sa, ako m\u00f4\u017eeme dosiahnu\u0165 r\u00f4zne \u00farovne izol\u00e1cie pomocou z\u00e1mkov.<\/p>\n<p>Tento oper\u00e1tor umo\u017e\u0148uje bra\u0165 nielen exkluz\u00edvne z\u00e1mky potrebn\u00e9 na zmenu d\u00e1t, ale aj takzvan\u00e9 zdie\u013ean\u00e9, ktor\u00e9 m\u00f4\u017eu bra\u0165 naraz nieko\u013eko tokov, ke\u010f potrebuj\u00fa \u010d\u00edta\u0165 d\u00e1ta, ktor\u00e9 by nemali by\u0165 menen\u00e9 in\u00fdmi procesmi po\u010das \u010d\u00edtania.<\/p>\n<p>Viac inform\u00e1ci\u00ed o dvojf\u00e1zovej met\u00f3de z\u00e1mkov v ru\u0161tine a angli\u010dtine:<\/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\">Dvojf\u00e1zov\u00fd z\u00e1mok<\/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>Zlo\u017eitos\u0165 spo\u010d\u00edva v tom, \u017ee po\u010das transakcie m\u00f4\u017ee by\u0165 stav datab\u00e1zy nekonzistentn\u00fd, av\u0161ak tieto nekonzistentn\u00e9 d\u00e1ta s\u00fa vidite\u013en\u00e9 in\u00fdmi procesmi. Ako tomu zabr\u00e1ni\u0165?<\/p>\n<p>Dosiahneme to pomocou z\u00e1mkov tak\u00fdmi oknami vidite\u013enosti, v ktor\u00fdch bude stav datab\u00e1zy konzistentn\u00fd. A v\u0161etky pr\u00edstupy k tak\u00fdm okn\u00e1m vidite\u013enosti konzistentn\u00e9ho stavu bud\u00fa kontrolovan\u00e9 z\u00e1mkami.<\/p>\n<p>Zdie\u013ean\u00e9 z\u00e1mky t\u00fdch ist\u00fdch \u00fadajov s\u00fa opakovate\u013en\u00e9 \u2014 m\u00f4\u017eu ich z\u00edska\u0165 viacer\u00e9 procesy. Tieto z\u00e1mky zakazuj\u00fa in\u00fdm procesom meni\u0165 \u00fadaje, t. j. pou\u017e\u00edvaj\u00fa sa na vytvorenie okien konzistentn\u00e9ho stavu DB.<\/p>\n<p>Exkluz\u00edvne z\u00e1mky sa pou\u017e\u00edvaj\u00fa na zmeny \u00fadajov \u2014 tak\u00fa z\u00e1mku m\u00f4\u017ee z\u00edska\u0165 iba jeden proces. Exkluz\u00edvnu z\u00e1mku m\u00f4\u017ee z\u00edska\u0165:<\/p>\n<ol>\n<li>Ak\u00fdko\u013evek proces, ak s\u00fa \u00fadaje vo\u013en\u00e9.<\/li>\n<li>Iba ten proces, ktor\u00fd m\u00e1 na tieto \u00fadaje zdie\u013ean\u00fa z\u00e1mku a ako prv\u00fd po\u017eiadal o exkluz\u00edvnu z\u00e1mku.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transakcie v glob\u00e1loch InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010c\u00edm u\u017e\u0161ie je okno vidite\u013enosti, t\u00fdm dlh\u0161ie musia ostatn\u00e9 procesy \u010daka\u0165, ale t\u00fdm konzistentnej\u0161\u00ed m\u00f4\u017ee by\u0165 stav DB v \u0148om.<\/p>\n<p><b>READ_COMMITTED<\/b> \u2014 podstatou tejto \u00farovne je, \u017ee vid\u00edme iba potvrden\u00e9 \u00fadaje z in\u00fdch tokov. Ak \u00fadaje v inej transakcii e\u0161te nie s\u00fa potvrden\u00e9, vid\u00edme ich predch\u00e1dzaj\u00facu verziu.<\/p>\n<p>To n\u00e1m umo\u017e\u0148uje paralelizova\u0165 pr\u00e1cu namiesto \u010dakania na uvo\u013enenie z\u00e1mky.<\/p>\n<p>Bez \u0161peci\u00e1lnych obmien nebudeme m\u00f4c\u0165 vidie\u0165 predch\u00e1dzaj\u00facu verziu \u00fadajov v IRIS, preto budeme musie\u0165 ob\u00eds\u0165 z\u00e1mky.<\/p>\n<p>T\u00fdm p\u00e1dom budeme musie\u0165 pomocou zdie\u013ean\u00fdch z\u00e1mok povoli\u0165 \u010d\u00edtanie \u00fadajov iba v momentoch konzistencie.<\/p>\n<p>Predpokladajme, \u017ee m\u00e1me datab\u00e1zu pou\u017e\u00edvate\u013eov ^person, ktor\u00ed prev\u00e1dzaj\u00fa peniaze medzi sebou.<\/p>\n<p>Moment prevodu od osoby 123 k osobe 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>\nMoment \u017eiadosti o mno\u017estvo pe\u0148az\u00ed od osoby 123 pred odpo\u010dtom by mal by\u0165 sprev\u00e1dzan\u00fd exkluz\u00edvnou z\u00e1mkou (predvolene):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nA ak je potrebn\u00e9 zobrazi\u0165 stav \u00fa\u010dtu v osobnej z\u00f3ne, je mo\u017en\u00e9 pou\u017ei\u0165 zdie\u013ean\u00fa z\u00e1mku alebo ju v\u00f4bec nepou\u017ei\u0165:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\"S\"\nWrite ^person(123)<\/code><\/pre>\n<p>\nAk v\u0161ak predpoklad\u00e1me, \u017ee oper\u00e1cie pr\u00e1cu s DB sa vykon\u00e1vaj\u00fa prakticky okam\u017eite (pripom\u00ednam, \u017ee glob\u00e1ly \u2014 to s\u00fa ove\u013ea ni\u017e\u0161ie \u0161trukt\u00fary ako rela\u010dn\u00e1 tabu\u013eka), potom potreba tejto \u00farovne kles\u00e1.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 na tejto \u00farovni izol\u00e1cie je dovolen\u00e9, \u017ee m\u00f4\u017eu by\u0165 viacer\u00e9 \u010d\u00edtania \u00fadajov, ktor\u00e9 m\u00f4\u017eu by\u0165 zmenen\u00e9 paraleln\u00fdmi transakciami. <\/p>\n<p>T\u00fdm p\u00e1dom budeme musie\u0165 zavies\u0165 zdie\u013ean\u00fa z\u00e1mku na \u010d\u00edtanie \u00fadajov, ktor\u00e9 men\u00edme, a exkluz\u00edvne z\u00e1mky na \u00fadaje, ktor\u00e9 men\u00edme.<\/p>\n<p>Oper\u00e1tor LOCK umo\u017e\u0148uje podrobne zadefinova\u0165 v\u0161etky potrebn\u00e9 z\u00e1mky v jednom oper\u00e1tore, ktor\u00fdch m\u00f4\u017ee by\u0165 ve\u013emi ve\u013ea.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\n\u010d\u00edtanie ^person(123, amount)<\/code><\/pre>\n<p>\nin\u00e9 oper\u00e1cie (medzit\u00fdm sa paraleln\u00e9 vl\u00e1kna pok\u00fa\u0161aj\u00fa zmeni\u0165 ^person(123, amount), ale nem\u00f4\u017eu)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nzmena ^person(123, amount)\nLOCK -^person(123, amount)\n\n\u010d\u00edtanie ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nPri vymenov\u00e1van\u00ed z\u00e1mkov po \u010diarkach s\u00fa bran\u00e9 postupne, ale ak to urob\u00edme takto:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\ns\u00fa bran\u00e9 atom\u00e1rne v\u0161etky naraz.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 budeme musie\u0165 nastavi\u0165 z\u00e1mky tak, aby nakoniec v\u0161etky transakcie, ktor\u00e9 maj\u00fa spolo\u010dn\u00e9 d\u00e1ta, boli vykon\u00e1van\u00e9 postupne. Pre tento pr\u00edstup musia by\u0165 v\u00e4\u010d\u0161ina z\u00e1mkov exkluz\u00edvne a bran\u00e9 na najmen\u0161ie oblasti glob\u00e1lu pre v\u00fdkon.<\/p>\n<p>Ak hovor\u00edme o odpo\u010d\u00edtan\u00ed prostriedkov v glob\u00e1le ^person, pre \u0148u je akceptovate\u013en\u00e1 iba \u00farove\u0148 izol\u00e1cie SERIALIZE, preto\u017ee peniaze musia by\u0165 m\u00ed\u0148an\u00e9 striktne postupne, inak je mo\u017en\u00e9 min\u00fa\u0165 t\u00fa ist\u00fa sumu viackr\u00e1t.<\/p>\n<h2>4. Dlhodobos\u0165<\/h2>\n<p>\nTestoval som s tvrd\u00fdm vyp\u00ednan\u00edm kontajnera pomocou<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDatab\u00e1za to pren\u00e1\u0161ala dobre. Probl\u00e9my neboli zisten\u00e9.<\/p>\n<h2>Z\u00e1ver<\/h2>\n<p>\nPre glob\u00e1ly v InterSystems IRIS existuje podpora transakci\u00ed. S\u00fa skuto\u010dne atom\u00e1rne, spo\u013eahliv\u00e9. Na zabezpe\u010denie konzistencie DB v glob\u00e1loch s\u00fa potrebn\u00e9 \u00fasilie program\u00e1tora a pou\u017eitie transakci\u00ed, preto\u017ee v nej nie s\u00fa zlo\u017een\u00e9 vstavan\u00e9 kon\u0161trukcie ako vonkaj\u0161ie k\u013e\u00fa\u010de.<\/p>\n<p>\u00darove\u0148 izol\u00e1cie v glob\u00e1loch bez pou\u017eitia z\u00e1mkov je READ UNCOMMITED, a pri pou\u017eit\u00ed z\u00e1mkov je mo\u017en\u00e9 zaru\u010di\u0165 a\u017e \u00farove\u0148 SERIALIZE.<\/p>\n<p>Spr\u00e1vnos\u0165 a r\u00fdchlos\u0165 pr\u00e1ce transakci\u00ed v glob\u00e1loch z\u00e1vis\u00ed ve\u013emi silno od zru\u010dnosti program\u00e1tora: \u010d\u00edm viac sa pou\u017e\u00edvaj\u00fa shared-z\u00e1mky pri \u010d\u00edtan\u00ed, t\u00fdm vy\u0161\u0161ia je \u00farove\u0148 izol\u00e1cie, a \u010d\u00edm u\u017e\u0161ie s\u00fa bran\u00e9 exkluz\u00edvne z\u00e1mky, t\u00fdm v\u00e4\u010d\u0161ia je r\u00fdchlos\u0165.<br \/>\n<br \/>Zdroj: <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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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\udd47Transakcie v glob\u00e1loch InterSystems IRIS | ProHoster","description":"DBMS InterSystems IRIS podporuje zauj\u00edmav\u00e9 \u0161trukt\u00fary.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}