{"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\/cs\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transakce v glob\u00e1lech InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transakce v glob\u00e1lech InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Datab\u00e1zov\u00fd syst\u00e9m InterSystems IRIS podporuje zaj\u00edmav\u00e9 struktury pro ukl\u00e1d\u00e1n\u00ed dat \u2014 glob\u00e1ly. V podstat\u011b se jedn\u00e1 o v\u00edcerozm\u011brn\u00e9 kl\u00ed\u010de s r\u016fzn\u00fdmi dodate\u010dn\u00fdmi funkcemi, jako jsou transakce, rychl\u00e9 funkce pro proch\u00e1zen\u00ed datov\u00fdch strom\u016f, z\u00e1mky a vlastn\u00ed jazyk ObjectScript.<\/p>\n<p>V\u00edce o glob\u00e1lech v s\u00e9rii \u010dl\u00e1nk\u016f \u201eGlob\u00e1ly \u2014 \u010darod\u011bjnick\u00e9 me\u010de pro ukl\u00e1d\u00e1n\u00ed dat\u201c:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Stromy. \u010c\u00e1st 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Stromy. \u010c\u00e1st 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">\u0158\u00eddk\u00e9 pole. \u010c\u00e1st 3<\/a><\/noindex><\/p>\n<p>Za\u010dalo m\u011b zaj\u00edmat, jak jsou realizov\u00e1ny transakce v glob\u00e1lech, jak\u00e9 maj\u00ed specifika. V\u017edy\u0165 se jedn\u00e1 o zcela jinou strukturu pro ukl\u00e1d\u00e1n\u00ed dat ne\u017e n\u00e1m obecn\u011b zn\u00e1m\u00e9 tabulky. Mnohem n\u00edzko\u00farov\u0148ov\u011bj\u0161\u00ed.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJak je zn\u00e1mo z teorie rela\u010dn\u00edch datab\u00e1z\u00ed, dobr\u00e1 realizace transakc\u00ed by m\u011bla spl\u0148ovat po\u017eadavky <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomicita.<\/b> Zaznamen\u00e1vaj\u00ed se v\u0161echny zm\u011bny proveden\u00e9 v transakci nebo \u017e\u00e1dn\u00e9.<\/p>\n<p><b>C \u2014 Konzistence.<\/b> Po dokon\u010den\u00ed transakce mus\u00ed b\u00fdt logick\u00fd stav datab\u00e1ze intern\u011b nekontradiktorn\u00ed. Velmi \u010dasto se tento po\u017eadavek t\u00fdk\u00e1 program\u00e1tor\u016f, ale v p\u0159\u00edpad\u011b SQL datab\u00e1z\u00ed se to t\u00fdk\u00e1 tak\u00e9 ciz\u00edch kl\u00ed\u010d\u016f.<\/p>\n<p><b>I \u2014 Izolace.<\/b> Soub\u011b\u017en\u011b prov\u00e1d\u011bn\u00e9 transakce by na sebe nem\u011bly m\u00edt vliv.<\/p>\n<p><b>D \u2014 Trvanlivost.<\/b> Po \u00fasp\u011b\u0161n\u00e9m dokon\u010den\u00ed transakce by probl\u00e9my na ni\u017e\u0161\u00edch \u00farovn\u00edch (nap\u0159\u00edklad v\u00fdpadek nap\u00e1jen\u00ed) nem\u011bly ovlivnit data zm\u011bn\u011bn\u00e1 transakc\u00ed.<\/p>\n<p>Glob\u00e1ly jsou nerela\u010dn\u00ed datov\u00e9 struktury. Byly navr\u017eeny pro extr\u00e9mn\u011b rychlou pr\u00e1ci na velmi omezen\u00e9m hardwaru. Poj\u010fme se pod\u00edvat na realizaci transakc\u00ed v glob\u00e1lech pomoc\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">ofici\u00e1ln\u00edho docker obrazu IRIS<\/a><\/noindex>.<\/p>\n<p>Pro podporu transakc\u00ed v IRIS se pou\u017e\u00edvaj\u00ed p\u0159\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. Atomicita<\/h2>\n<p>\nNejjednodu\u0161eji lze ov\u011b\u0159it atomicitu. Ov\u011b\u0159\u00edme z konzole datab\u00e1ze.<\/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>\nPak provedeme 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\u0161echno je v po\u0159\u00e1dku. Atomicita byla dodr\u017eena: v\u0161echny zm\u011bny byly zaps\u00e1ny.<\/p>\n<p>Zt\u00ed\u017e\u00edme \u00fakol, zavedeme chybu a pod\u00edv\u00e1me se, jak se transakce uchov\u00e1, \u010d\u00e1ste\u010dn\u011b nebo v\u016fbec.<\/p>\n<p>Je\u0161t\u011b jednou ov\u011b\u0159\u00edme atomicitu:<\/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>\nPot\u00e9 n\u00e1siln\u011b zastav\u00edme kontejner, spust\u00edme ho a pod\u00edv\u00e1me se. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nTento p\u0159\u00edkaz je prakticky ekvivalentn\u00ed n\u00e1siln\u00e9mu vypnut\u00ed nap\u00e1jen\u00ed, proto\u017ee pos\u00edl\u00e1 sign\u00e1l okam\u017eit\u00e9ho zastaven\u00ed procesu SIGKILL.<\/p>\n<p>Mohla \u010d\u00e1ste\u010dn\u011b z\u016fstat transakce?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Ne, nez\u016fstala.<\/p>\n<p>Vyzkou\u0161\u00edme p\u0159\u00edkaz pro vr\u00e1cen\u00ed:<\/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>\nTak\u00e9 se nic nezachovalo.<\/p>\n<h2>2. Konzistence<\/h2>\n<p>\nProto\u017ee v glob\u00e1ln\u00edch datech jsou kl\u00ed\u010de tak\u00e9 tvo\u0159eny na glob\u00e1lech (p\u0159ipom\u00edn\u00e1m, \u017ee global je struktura ni\u017e\u0161\u00ed \u00farovn\u011b pro ukl\u00e1d\u00e1n\u00ed dat ne\u017e rela\u010dn\u00ed tabulka), pro spln\u011bn\u00ed po\u017eadavku na konzistenci je t\u0159eba zahrnout zm\u011bnu kl\u00ed\u010de do t\u00e9\u017ee transakce, co i zm\u011bnu glob\u00e1lu.<\/p>\n<p>Nap\u0159\u00edklad m\u00e1me global ^person, v n\u011bm\u017e uchov\u00e1v\u00e1me osoby a jako kl\u00ed\u010d pou\u017e\u00edv\u00e1me I\u010cO.<\/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>\nAbychom dos\u00e1hli rychl\u00e9ho hled\u00e1n\u00ed podle p\u0159\u00edjmen\u00ed a jm\u00e9na, vytvo\u0159ili jsme kl\u00ed\u010d ^index.<\/p>\n<pre><code class=\"bash\">^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1<\/code><\/pre>\n<p>\nAby datab\u00e1ze byla konzistentn\u00ed, mus\u00edme p\u0159id\u00e1vat osobu takto:<\/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>\nPokud jde o maz\u00e1n\u00ed, tak\u00e9 mus\u00edme pou\u017e\u00edt transakci:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nJin\u00fdmi slovy, spln\u011bn\u00ed po\u017eadavku na konzistenci le\u017e\u00ed pln\u011b na ramenou program\u00e1tora. Ale kdy\u017e jde o glob\u00e1ly, je to norm\u00e1ln\u00ed vzhledem k jejich n\u00edzk\u00e9 \u00farovni.<\/p>\n<h2>3. Izolace<\/h2>\n<p>\nTady za\u010d\u00edn\u00e1 chaos. Mnoho u\u017eivatel\u016f sou\u010dasn\u011b pracuje na stejn\u00e9 datab\u00e1zi, m\u011bn\u00ed stejn\u00e9 \u00fadaje.<\/p>\n<p>Situace se d\u00e1 p\u0159irovnat k tomu, kdy\u017e mnoho u\u017eivatel\u016f sou\u010dasn\u011b pracuje se stejn\u00fdm repozit\u00e1\u0159em k\u00f3du a sna\u017e\u00ed se sou\u010dasn\u011b commitovat zm\u011bny do mnoha soubor\u016f najednou.<\/p>\n<p>Datab\u00e1ze to mus\u00ed zvl\u00e1dat v re\u00e1ln\u00e9m \u010dase. Vzhledem k tomu, \u017ee ve v\u00e1\u017en\u00fdch firm\u00e1ch existuje i speci\u00e1ln\u00ed osoba, kter\u00e1 se star\u00e1 o kontrolu verz\u00ed (o slou\u010den\u00ed v\u011btv\u00ed, vy\u0159e\u0161en\u00ed konflikt\u016f atd.), a datab\u00e1ze to v\u0161echno mus\u00ed d\u011blat v re\u00e1ln\u00e9m \u010dase, je obt\u00ed\u017enost \u00fakolu a spr\u00e1vnost n\u00e1vrhu datab\u00e1ze a k\u00f3du, kter\u00fd ji spravuje, jasn\u00e1.<\/p>\n<p>Datab\u00e1ze nem\u016f\u017ee pochopit smysl akc\u00ed prov\u00e1d\u011bn\u00fdch u\u017eivateli, aby zabr\u00e1nila konflikt\u016fm, pokud pracuj\u00ed se stejn\u00fdmi daty. M\u016f\u017ee pouze zru\u0161it jednu transakci, kter\u00e1 je v rozporu s jinou, nebo je prov\u00e9st po sob\u011b.<\/p>\n<p>Dal\u0161\u00edm probl\u00e9mem je, \u017ee b\u011bhem prov\u00e1d\u011bn\u00ed transakce (p\u0159ed potvrzen\u00edm) m\u016f\u017ee b\u00fdt stav datab\u00e1ze nekonzistentn\u00ed, a proto je \u017e\u00e1douc\u00ed, aby m\u011bli ostatn\u00ed transakce omezen\u00fd p\u0159\u00edstup k nekonzistentn\u00edmu stavu datab\u00e1ze, co\u017e se v rela\u010dn\u00edch DB dosahuje mnoha zp\u016fsoby: vytv\u00e1\u0159en\u00edm sn\u00edmk\u016f, v\u00edce verzemi \u0159\u00e1dk\u016f atd.<\/p>\n<p>P\u0159i paraleln\u00edm prov\u00e1d\u011bn\u00ed transakc\u00ed je d\u016fle\u017eit\u00e9, aby si navz\u00e1jem nep\u0159ek\u00e1\u017eely. To je vlastnost izolace.<\/p>\n<p>SQL definuje 4 \u00farovn\u011b izolace:<\/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>\nPoj\u010fme se pod\u00edvat na ka\u017edou \u00farove\u0148 jednotliv\u011b. N\u00e1klady na implementaci ka\u017ed\u00e9 \u00farovn\u011b rostou t\u00e9m\u011b\u0159 exponenci\u00e1ln\u011b.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 to je nejni\u017e\u0161\u00ed \u00farove\u0148 izolace, ale z\u00e1rove\u0148 nejrychlej\u0161\u00ed. Transakce mohou \u010d\u00edst zm\u011bny proveden\u00e9 navz\u00e1jem.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 to je dal\u0161\u00ed \u00farove\u0148 izolace, kter\u00e1 p\u0159edstavuje kompromis. Transakce nemohou \u010d\u00edst zm\u011bny proveden\u00e9 navz\u00e1jem, dokud nejsou potvrzeny, ale mohou \u010d\u00edst jak\u00e9koli zm\u011bny proveden\u00e9 po potvrzen\u00ed.<\/p>\n<p>Pokud m\u00e1me dlouhou transakci T1, b\u011bhem kter\u00e9 do\u0161lo k potvrzen\u00edm v transakc\u00edch T2, T3 \u2026 Tn, kter\u00e9 pracovaly se stejn\u00fdmi daty jako T1, pak p\u0159i dotazu na data v T1 poka\u017ed\u00e9 dostaneme jin\u00fd v\u00fdsledek. Tento jev se naz\u00fdv\u00e1 nenapraviteln\u00e9 \u010dten\u00ed.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 v t\u00e9to \u00farovni izolace nem\u00e1me jev nenapraviteln\u00e9ho \u010dten\u00ed, \u010d\u00edm\u017e vznikaj\u00ed sn\u00edmky v\u00fdsledn\u00fdch dat pro ka\u017ed\u00fd po\u017eadavek na \u010dten\u00ed dat, kter\u00e9 se p\u0159i op\u011btovn\u00e9m pou\u017eit\u00ed v t\u00e9to sam\u00e9 transakci pou\u017e\u00edvaj\u00ed z tohoto sn\u00edmku. V t\u00e9to \u00farovni izolace je v\u0161ak mo\u017en\u00e9 \u010d\u00edst fantomov\u00e1 data, co\u017e znamen\u00e1 \u010dten\u00ed nov\u00fdch \u0159\u00e1dk\u016f, kter\u00e9 byly p\u0159id\u00e1ny paraleln\u00edmi potvrzen\u00fdmi transakcemi.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 nejvy\u0161\u0161\u00ed \u00farove\u0148 izolace. Je charakterizov\u00e1na t\u00edm, \u017ee data jak\u00fdmkoli zp\u016fsobem pou\u017e\u00edvan\u00e1 v transakci (\u010dten\u00ed nebo zm\u011bna) se st\u00e1vaj\u00ed dostupn\u00fdmi jin\u00fdm transakc\u00edm a\u017e po dokon\u010den\u00ed prvn\u00ed transakce.<\/p>\n<p>Nejprve se pod\u00edvejme, zda je v transakci izolace operac\u00ed od hlavn\u00edho vl\u00e1kna. Otev\u0159eme 2 termin\u00e1lov\u00e1 okna.<\/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>\nIzolace nen\u00ed p\u0159\u00edtomna. Jedno vl\u00e1kno vid\u00ed, co d\u011bl\u00e1 druh\u00e9 otev\u0159en\u00e9 transakce.<\/p>\n<p>Pod\u00edvejme se, zda transakce r\u016fzn\u00fdch vl\u00e1ken vid\u00ed, co se v nich d\u011bje. <\/p>\n<p>Otev\u0159eme 2 termin\u00e1lov\u00e1 okna a otev\u0159eme 2 transakce sou\u010dasn\u011b.<\/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>\nSou\u010dasn\u00e9 transakce vid\u00ed data navz\u00e1jem. Tak\u017ee jsme dostali nejjednodu\u0161\u0161\u00ed, ale tak\u00e9 nejrychlej\u0161\u00ed \u00farove\u0148 izolace READ UNCOMMITTED.<\/p>\n<p>V z\u00e1sad\u011b to bylo lze o\u010dek\u00e1vat u glob\u00e1ln\u00edch, pro kter\u00e9 je v\u00fdkon v\u017edy prioritou. <\/p>\n<p>Co v\u0161ak d\u011blat, kdy\u017e budeme pot\u0159ebovat vy\u0161\u0161\u00ed \u00farove\u0148 izolace v operac\u00edch na glob\u00e1ln\u00edch?<\/p>\n<p>Je t\u0159eba p\u0159em\u00fd\u0161let o tom, pro\u010d v\u016fbec \u00farovn\u011b izolace pot\u0159ebujeme a jak funguj\u00ed.<\/p>\n<p>Nejvy\u0161\u0161\u00ed \u00farove\u0148 izolace SERIALIZE znamen\u00e1, \u017ee v\u00fdsledek paraleln\u011b prov\u00e1d\u011bn\u00fdch transakc\u00ed je ekvivalentn\u00ed jejich sekven\u010dn\u00edmu proveden\u00ed, co\u017e zaru\u010duje absenci koliz\u00ed.<\/p>\n<p>Toho m\u016f\u017eeme dos\u00e1hnout pomoc\u00ed spr\u00e1vn\u00fdch z\u00e1mk\u016f v ObjectScript, kter\u00e9 maj\u00ed mno\u017estv\u00ed r\u016fzn\u00fdch zp\u016fsob\u016f pou\u017eit\u00ed: lze prov\u00e1d\u011bt b\u011b\u017en\u00e9, inkrement\u00e1ln\u00ed, v\u00edcen\u00e1sobn\u00e9 z\u00e1mky pomoc\u00ed p\u0159\u00edkazu <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\u0161\u00ed \u00farovn\u011b izolace jsou kompromise, kter\u00e9 maj\u00ed za c\u00edl zv\u00fd\u0161it rychlost datab\u00e1ze.<\/p>\n<p>Pod\u00edvejme se, jak m\u016f\u017eeme dos\u00e1hnout r\u016fzn\u00fdch \u00farovn\u00ed izolace pomoc\u00ed z\u00e1mk\u016f.<\/p>\n<p>Tento p\u0159\u00edkaz umo\u017e\u0148uje br\u00e1t nejen exkluzivn\u00ed z\u00e1mky pot\u0159ebn\u00e9 pro zm\u011bnu dat, ale tak\u00e9 tzv. sd\u00edlen\u00e9, kter\u00e9 mohou b\u00fdt sou\u010dasn\u011b z\u00edsk\u00e1ny n\u011bkolika vl\u00e1kny, kdy\u017e pot\u0159ebuj\u00ed \u010d\u00edst data, kter\u00e1 by nem\u011bla b\u00fdt b\u011bhem \u010dten\u00ed m\u011bn\u011bna jin\u00fdmi procesy.<\/p>\n<p>V\u00edce o dvouf\u00e1zov\u00e9 metod\u011b blokov\u00e1n\u00ed v ru\u0161tin\u011b a angli\u010dtin\u011b:<\/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\">Dvouf\u00e1zov\u00e9 blokov\u00e1n\u00ed<\/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>Obt\u00ed\u017enost spo\u010d\u00edv\u00e1 v tom, \u017ee b\u011bhem transakce m\u016f\u017ee b\u00fdt stav datab\u00e1ze nekonzistentn\u00ed, av\u0161ak tyto nekonzistentn\u00ed \u00fadaje jsou viditeln\u00e9 jin\u00fdm proces\u016fm. Jak tomu p\u0159edej\u00edt?<\/p>\n<p>Pomoc\u00ed z\u00e1mk\u016f vytvo\u0159\u00edme takov\u00e1 okna viditelnosti, ve kter\u00fdch bude stav datab\u00e1ze konzistentn\u00ed. A v\u0161echny p\u0159\u00edstupy k t\u011bmto okn\u016fm viditelnosti konzistentn\u00edho stavu budou \u0159\u00edzeny z\u00e1mky.<\/p>\n<p>Sd\u00edlen\u00e9 z\u00e1mky pro stejn\u00e9 data umo\u017e\u0148uj\u00ed v\u00edce proces\u016fm je pou\u017e\u00edvat. Tyto z\u00e1mky zakazuj\u00ed jin\u00fdm proces\u016fm m\u011bnit data, tj. pou\u017e\u00edvaj\u00ed se k vytv\u00e1\u0159en\u00ed oken konzistentn\u00edho stavu datab\u00e1ze.<\/p>\n<p>Exkluzivn\u00ed z\u00e1mky se pou\u017e\u00edvaj\u00ed pro zm\u011bnu dat \u2014 tento z\u00e1mek m\u016f\u017ee m\u00edt pouze jeden proces. Exkluzivn\u00ed z\u00e1mek m\u016f\u017ee m\u00edt:<\/p>\n<ol>\n<li>Jak\u00fdkoli proces, pokud jsou data voln\u00e1<\/li>\n<li>Pouze ten proces, kter\u00fd m\u00e1 pro tato data sd\u00edlen\u00fd z\u00e1mek a jako prvn\u00ed po\u017e\u00e1dal o exkluzivn\u00ed z\u00e1mek.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transakce v glob\u00e1lech InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010c\u00edm u\u017e\u0161\u00ed je okno viditelnosti, t\u00edm d\u00e9le mus\u00ed ostatn\u00ed procesy \u010dekat, ale t\u00edm konzistentn\u011bj\u0161\u00ed m\u016f\u017ee b\u00fdt stav datab\u00e1ze v n\u011bm.<\/p>\n<p><b>READ_COMMITTED<\/b> \u2014 podstata t\u00e9to \u00farovn\u011b spo\u010d\u00edv\u00e1 v tom, \u017ee vid\u00edme pouze potvrzen\u00e1 data z jin\u00fdch tok\u016f. Pokud data v jin\u00e9 transakci je\u0161t\u011b nebyla potvrzena, vid\u00edme jejich starou verzi.<\/p>\n<p>To n\u00e1m umo\u017e\u0148uje paralelizovat pr\u00e1ci m\u00edsto \u010dek\u00e1n\u00ed na uvoln\u011bn\u00ed z\u00e1mku.<\/p>\n<p>Bez speci\u00e1ln\u00edch trik\u016f nebudeme moci vid\u011bt starou verzi dat v IRIS, tak\u017ee se budeme muset obej\u00edt z\u00e1mky.<\/p>\n<p>Tud\u00ed\u017e mus\u00edme pomoc\u00ed sd\u00edlen\u00fdch z\u00e1mk\u016f povolit \u010dten\u00ed dat pouze v obdob\u00edch konzistence.<\/p>\n<p>P\u0159edstavme si, \u017ee m\u00e1me datab\u00e1zi u\u017eivatel\u016f ^person, kte\u0159\u00ed si navz\u00e1jem p\u0159ev\u00e1d\u011bj\u00ed pen\u00edze.<\/p>\n<p>Okam\u017eik p\u0159evodu od osoby 123 k osob\u011b 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>\nOkam\u017eik dotazu na mno\u017estv\u00ed pen\u011bz od osoby 123 p\u0159ed ode\u010dten\u00edm by m\u011bl b\u00fdt doprov\u00e1zen exkluzivn\u00edm z\u00e1mkem (v\u00fdchoz\u00ed):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nA pokud je pot\u0159eba zobrazit stav \u00fa\u010dtu v osobn\u00edm \u00fa\u010dtu, lze pou\u017e\u00edt sd\u00edlen\u00fd z\u00e1mek nebo ho v\u016fbec nepou\u017e\u00edt:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nNicm\u00e9n\u011b, pokud p\u0159edpokl\u00e1d\u00e1me, \u017ee operace pr\u00e1ce s datab\u00e1z\u00ed prob\u00edhaj\u00ed t\u00e9m\u011b\u0159 okam\u017eit\u011b (p\u0159ipom\u00edn\u00e1m, \u017ee glob\u00e1ly jsou mnohem n\u00edzko\u00farov\u0148ov\u011bj\u0161\u00ed struktura ne\u017e rela\u010dn\u00ed tabulka), pak pot\u0159eba t\u00e9to \u00farovn\u011b kles\u00e1.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 na t\u00e9to \u00farovni izolace se umo\u017e\u0148uje, \u017ee m\u016f\u017ee b\u00fdt n\u011bkolik \u010dten\u00ed dat, kter\u00e1 mohou b\u00fdt zm\u011bn\u011bna paraleln\u00edmi transakcemi. <\/p>\n<p>Tud\u00ed\u017e mus\u00edme um\u00edstit sd\u00edlen\u00fd z\u00e1mek na \u010dten\u00ed dat, kter\u00e1 m\u011bn\u00edme, a exkluzivn\u00ed z\u00e1mky na data, kter\u00e1 m\u011bn\u00edme.<\/p>\n<p>Oper\u00e1tor LOCK umo\u017e\u0148uje podrobn\u011b vypsat v\u0161echny pot\u0159ebn\u00e9 z\u00e1mky v jednom oper\u00e1toru, kter\u00fdch m\u016f\u017ee b\u00fdt velmi mnoho.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\n\u010dten\u00ed ^person(123, amount)<\/code><\/pre>\n<p>\ndal\u0161\u00ed operace (v tuto chv\u00edli se paraleln\u00ed vl\u00e1kna pokou\u0161ej\u00ed zm\u011bnit ^person(123, amount), ale nemohou)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nzm\u011bna ^person(123, amount)\nLOCK -^person(123, amount)\n\n\u010dten\u00ed ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nP\u0159i vyjmenov\u00e1n\u00ed z\u00e1mk\u016f \u010d\u00e1rkou se berou postupn\u011b, a pokud se to ud\u011bl\u00e1 takto:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\ntak se berou atom\u00e1rn\u011b najednou.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 budeme muset nastavit z\u00e1mky tak, aby nakonec v\u0161echny transakce, kter\u00e9 maj\u00ed spole\u010dn\u00e1 data byly prov\u00e1d\u011bny sekven\u010dn\u011b. Pro tento p\u0159\u00edstup by v\u011bt\u0161ina z\u00e1mk\u016f m\u011bla b\u00fdt exkluzivn\u00ed a m\u011bly by se br\u00e1t na co nejmen\u0161\u00edch oblastech glob\u00e1lu pro v\u00fdkon.<\/p>\n<p>Pokud hovo\u0159\u00edme o v\u00fdb\u011brech prost\u0159edk\u016f v glob\u00e1lu ^person, pak je pro n\u011bj p\u0159ijateln\u00e1 pouze \u00farove\u0148 izolace SERIALIZE, proto\u017ee pen\u00edze by m\u011bly b\u00fdt utraceny striktne sekven\u010dn\u011b, jinak je mo\u017en\u00e9 utratit stejnou \u010d\u00e1stku n\u011bkolikr\u00e1t.<\/p>\n<h2>4. Dlouhov\u011bkost<\/h2>\n<p>\nTestoval jsem n\u00e1hl\u00e9 vypnut\u00ed kontejneru pomoc\u00ed<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDatab\u00e1ze to p\u0159e\u017eila dob\u0159e. Nebyly zji\u0161t\u011bny \u017e\u00e1dn\u00e9 probl\u00e9my.<\/p>\n<h2>Z\u00e1v\u011br<\/h2>\n<p>\nPro glob\u00e1ly v InterSystems IRIS existuje podpora transakc\u00ed. Jsou skute\u010dn\u011b atom\u00e1rn\u00ed, spolehliv\u00e9. Pro zaji\u0161t\u011bn\u00ed konzistence DB v glob\u00e1lech jsou t\u0159eba \u00fasil\u00ed program\u00e1tora a pou\u017eit\u00ed transakc\u00ed, proto\u017ee v n\u00ed neexistuj\u00ed slo\u017eit\u00e9 vestav\u011bn\u00e9 konstrukce jako ciz\u00ed kl\u00ed\u010de.<\/p>\n<p>\u00darove\u0148 izolace u glob\u00e1l\u016f bez pou\u017eit\u00ed z\u00e1mk\u016f je READ UNCOMMITTED, a p\u0159i pou\u017eit\u00ed z\u00e1mk\u016f ji lze zajistit a\u017e do \u00farovn\u011b SERIALIZE.<\/p>\n<p>Spr\u00e1vnost a rychlost fungov\u00e1n\u00ed transakc\u00ed na glob\u00e1lech velmi siln\u011b z\u00e1vis\u00ed na um\u011bn\u00ed program\u00e1tora: \u010d\u00edm v\u00edce se pou\u017e\u00edvaj\u00ed sd\u00edlen\u00e9 z\u00e1mky p\u0159i \u010dten\u00ed, t\u00edm vy\u0161\u0161\u00ed je \u00farove\u0148 izolace, a \u010d\u00edm u\u017e\u0161\u00ed jsou exkluzivn\u00ed z\u00e1mky, t\u00edm v\u011bt\u0161\u00ed je v\u00fdkon.<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.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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47Transakce v glob\u00e1lech InterSystems IRIS | ProHoster","description":"Syst\u00e9m \u0159\u00edzen\u00ed datab\u00e1z\u00ed InterSystems IRIS podporuje zaj\u00edmav\u00e9 struktury.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}