{"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\/hr\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transakcije u globalama InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transakcije u globalama InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Sustav DB InterSystems IRIS podr\u017eava zanimljive strukture za pohranu podataka - globalne. U su\u0161tini, to su vi\u0161erazinski klju\u010devi s razli\u010ditim dodatnim mogu\u0107nostima u obliku transakcija, brzih funkcija za pretra\u017eivanje stabala podataka, zaklju\u010davanja i vlastitog jezika ObjectScript.<\/p>\n<p>Vi\u0161e o globalima u seriji \u010dlanaka \u201eGlobali - ma\u010devi blago za pohranu podataka\u201c:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Stabla. Dio 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Stabla. Dio 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Raspr\u0161eni nizovi. Dio 3<\/a><\/noindex><\/p>\n<p>Zanima me kako su implementirane transakcije u globalima, koje su njihove karakteristike. Jer to je potpuno druga\u010dija struktura za pohranu podataka, u odnosu na svima poznate tablice. Mnogo je niskorazinskija.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKao \u0161to je poznato iz teorije relacijskih baza podataka, dobra implementacija transakcija mora zadovoljiti zahtjeve <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A - Atomic (atomarnost).<\/b> Zapisane su sve promjene napravljene u transakciji ili ni\u0161ta.<\/p>\n<p><b>S - Consistency (dosljednost).<\/b> Nakon zavr\u0161etka transakcije, logi\u010dko stanje baze podataka mora biti me\u0111usobno dosljedno. Velikim dijelom, ovaj zahtjev odnosi se na programera, ali u slu\u010daju SQL-baza, to se tako\u0111er odnosi na vanjske klju\u010deve.<\/p>\n<p><b>I - Isolate (izolacija).<\/b> Paralelno izvr\u0161ene transakcije ne smiju utjecati jedna na drugu.<\/p>\n<p><b>D - Durable (izdr\u017eljivost).<\/b> Nakon uspje\u0161nog zavr\u0161etka transakcije, problemi na ni\u017eim razinama (npr. prekid napajanja) ne smiju utjecati na podatke promijenjene transakcijom.<\/p>\n<p>Globali su neredne strukture podataka. Kreirani su za izuzetno brzi rad na vrlo ograni\u010denom hardveru. Poglejmo implementaciju transakcija u globalima pomo\u0107u <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">slu\u017ebenog docker-ima\u017ea IRIS<\/a><\/noindex>.<\/p>\n<p>Za podr\u0161ku transakcijama u IRIS-u koriste se naredbe: <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. Atomarnost<\/h2>\n<p>\nNajlak\u0161e je provjeriti atomarnost. Provjeravamo iz konzole baze podataka.<\/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>\nNakon toga izvla\u010dimo:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nDobivamo:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nSve je u redu. Atomarnost je o\u010duvana: sve promjene su zapisane.<\/p>\n<p>Pove\u0107ajmo slo\u017eenost, uvest \u0107emo pogre\u0161ku i vidjeti kako \u0107e se transakcija o\u010duvati, djelomi\u010dno ili nikako.<\/p>\n<p>Jo\u0161 jednom provjeravamo atomarnost:<\/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>\nNakon \u010dega \u0107emo prisilno zaustaviti kontejner, pokrenuti ga i pogledati. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nOva naredba je gotovo ekvivalentna prisilnom isklju\u010divanju napajanja, jer \u0161alje signal hitnog zaustavljanja procesa SIGKILL.<\/p>\n<p>Mo\u017eda je transakcija djelomi\u010dno sa\u010duvana?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Ne, nije sa\u010duvana.<\/p>\n<p>Isprobajmo naredbu za povratak:<\/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>\nTako\u0111er ni\u0161ta nije sa\u010duvano.<\/p>\n<h2>2. Dosljednost<\/h2>\n<p>\nBudu\u0107i da se u bazama na globalima klju\u010devi tako\u0111er rade na globalima (podsje\u0107am, global je ni\u017ea struktura za pohranu podataka od relacijske tablice), za ispunjavanje zahtjeva dosljednosti, promjenu klju\u010da treba uklju\u010diti u istu transakciju kao i promjenu globala.<\/p>\n<p>Na primjer, imamo global ^person, u kojem pohranjujemo osobne podatke i kao klju\u010d koristimo OIB.<\/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>\nKako bismo imali brz pretra\u017eivanje prema prezimenu i imenu, napravili smo klju\u010d ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nKako bi baza bila dosljedna, moramo dodavati osobu na sljede\u0107i na\u010din:<\/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>\nDakle, pri brisanju tako\u0111er moramo koristiti transakciju:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nDrugim rije\u010dima, ispunjavanje zahtjeva dosljednosti potpuno le\u017ei na programerovim le\u0111ima. No kada su u pitanju globali \u2014 to je normalno, s obzirom na njihovu nisku razinu.<\/p>\n<h2>3. Izolacija<\/h2>\n<p>\nOvdje po\u010dinju komplikacije. Puno korisnika istovremeno radi na istoj bazi, mijenjaju\u0107i iste podatke.<\/p>\n<p>Situacija je sli\u010dna onoj kada mnogi korisnici istovremeno rade s istim repozitorijem koda i poku\u0161avaju istovremeno poslati promjene u mnoge datoteke.<\/p>\n<p>Baza podataka to mora rje\u0161avati u stvarnom vremenu. S obzirom na to da u ozbiljnim tvrtkama postoji \u010dak i posebna osoba koja je odgovorna za kontrolu verzija (za spajanje grana, rje\u0161avanje sukoba itd.), a BDP mora raditi sve to u stvarnom vremenu, jasno postaje slo\u017eenost zadatka i ispravnost dizajniranja baze podataka i koda koji ju odr\u017eava.<\/p>\n<p>Baza podataka ne mo\u017ee shvatiti svrhu radnji koje korisnici poduzimaju kako bi sprije\u010dila sukobe kada rade s istim podacima. Mo\u017ee samo poni\u0161titi jednu transakciju koja je u sukobu s drugom ili ih izvr\u0161iti uzastopno.<\/p>\n<p>Jo\u0161 jedan problem je \u0161to tijekom izvr\u0161enja transakcije (prije potvrde), stanje baze mo\u017ee biti nesuglasno, stoga je po\u017eeljno da druge transakcije nemaju pristup nesuglasnom stanju baze podataka, \u0161to se posti\u017ee u relacijskim bazama na mnogo na\u010dina: stvaranjem snimaka, vi\u0161estrukim verzijama redaka itd.<\/p>\n<p>Pri paralelnom izvr\u0161avanju transakcija va\u017eno nam je da ne ometaju jedna drugu. To je svojstvo izolacije.<\/p>\n<p>SQL definira 4 razine izolacije:<\/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>\nRazmotrit \u0107emo svaku razinu posebno. Tro\u0161kovi implementacije svake razine rastu skoro eksponencijalno.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 to je najni\u017ea razina izolacije, ali istovremeno i najbr\u017ea. Transakcije mogu \u010ditati promjene koje su jedna drugoj unijele.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 to je sljede\u0107a razina izolacije koja predstavlja kompromis. Transakcije ne mogu \u010ditati promjene koje su jedna drugoj unijele do potvrde, ali mogu \u010ditati sve promjene unesene nakon potvrde.<\/p>\n<p>Ako imamo dugu transakciju T1, tijekom koje su se dogodile potvrde u transakcijama T2, T3 \u2026 Tn, koje su radile s istim podacima kao i T1, prilikom zahtjeva za podacima u T1 svaki put \u0107emo dobiti druga\u010diji rezultat. Ovaj fenomen naziva se neponovljivo \u010ditanje.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 na ovoj razini izolacije nemamo fenomena neponovljivog \u010ditanja, budu\u0107i da se za svaki zahtjev za \u010ditanje podataka stvara snimak rezultata podataka, a prilikom ponovne uporabe u istoj transakciji koriste se podaci iz snimka. Me\u0111utim, na ovoj razini izolacije mo\u017ee do\u0107i do \u010ditanja fantomskih podataka. Mislimo na \u010ditanje novih redaka koji su dodani paralelnim fiksiranim transakcijama.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 najvi\u0161a razina izolacije. Karakterizira je to \u0161to su podaci na bilo koji na\u010din kori\u0161teni u transakciji (\u010ditanje ili izmjena) dostupni drugim transakcijama tek nakon zavr\u0161etka prve transakcije.<\/p>\n<p>Prvo \u0107emo vidjeti postoji li izolacija operacija u transakciji od glavnog toka. Otvorimo 2 prozora terminala.<\/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>\nIzolacija ne postoji. Jedan tok vidi \u0161to radi drugi koji je otvorio transakciju.<\/p>\n<p>Pogledajmo vide li transakcije razli\u010ditih tokova ono \u0161to se doga\u0111a unutar njih. <\/p>\n<p>Otvorimo 2 prozora terminala i otvorimo 2 paralelne transakcije.<\/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>\nParalelne transakcije vide podatke jedne druge. Tako smo dobili najjednostavniju, ali i najbr\u017eu razinu izolacije READ UNCOMMITED.<\/p>\n<p>To se moglo o\u010dekivati za globalne, za koje je uvijek brzina bila na prvom mjestu. <\/p>\n<p>\u0160to u\u010diniti ako nam zatreba vi\u0161a razina izolacije u operacijama na globalima?<\/p>\n<p>Ovdje trebamo razmisliti za\u0161to uop\u0107e postoje razine izolacije i kako one rade.<\/p>\n<p>Najvi\u0161a razina izolacije SERIALIZE zna\u010di da je rezultat paralelno izvr\u0161enih transakcija ekvivalentan njihovom sekvencijalnom izvr\u0161enju, \u0161to jam\u010di odsustvo kolizija.<\/p>\n<p>To mo\u017eemo u\u010diniti pomo\u0107u pravilnih zaklju\u010davanja u ObjectScriptu, koje imaju mno\u0161tvo razli\u010ditih na\u010dina primjene: mo\u017eemo raditi obi\u010dne, inkrementne, vi\u0161estruke zaklju\u010dake komandom <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\u017ee razine izolacije su kompromisi s ciljem pove\u0107anja brzine rada baze podataka.<\/p>\n<p>Pogledajmo kako mo\u017eemo posti\u0107i razli\u010dite razine izolacije pomo\u0107u zaklju\u010davanja.<\/p>\n<p>Ova naredba omogu\u0107uje uzimanje ne samo ekskluzivnih zaklju\u010davanja potrebnih za promjenu podataka, ve\u0107 i takozvanih shared, koje mogu uzimati paralelno odjednom vi\u0161e tokova kada im je potrebno \u010ditati podatke koji ne bi trebali biti promijenjeni od strane drugih procesa tijekom \u010ditanja.<\/p>\n<p>Vi\u0161e o dvofaznome metodu zaklju\u010davanja na hrvatskom i engleskom jeziku:<\/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\">Dvofazno zaklju\u010davanje<\/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>Te\u017eina le\u017ei u tome \u0161to stanje baze tijekom transakcije mo\u017ee biti nekonzistentno, ali ti nekonzistentni podaci su vidljivi drugim procesima. Kako to izbje\u0107i?<\/p>\n<p>Napravit \u0107emo s zaklju\u010davanjima takva vidna okna u kojima \u0107e stanje baze biti konzistentno. I svi pristupi tim vidnim oknima konzistentnog stanja bit \u0107e kontrolirani zaklju\u010davanjima.<\/p>\n<p>Dijeljene blokade istih podataka su vi\u0161ekratne \u2014 mogu ih preuzeti vi\u0161e procesa. Ove blokade onemogu\u0107uju drugim procesima da mijenjaju podatke, tj. koriste se za formiranje prozora dosljednog stanja baze podataka.<\/p>\n<p>Ekskluzivne blokade koriste se za promjene podataka \u2014 takvu blokadu mo\u017ee preuzeti samo jedan proces. Eksplicitnu blokadu mo\u017ee preuzeti:<\/p>\n<ol>\n<li>Bilo koji proces, ako su podaci slobodni.<\/li>\n<li>Samo onaj proces koji ima na tim podacima dijeljenu blokadu i koji je prvi zatra\u017eio ekskluzivnu blokadu.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transakcije u globalama InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160to je u\u017ei prozor vidljivosti, to du\u017ee drugi procesi moraju \u010dekati, ali stanje baze podataka mo\u017ee biti dosljednije u njemu.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 su\u0161tina ovog nivoa je da vidimo samo potvr\u0111ene podatke iz drugih tokova. Ako podaci u drugoj transakciji jo\u0161 nisu potvr\u0111eni, vidimo njihovu staru verziju.<\/p>\n<p>To nam omogu\u0107ava da paraleliziramo rad umjesto da \u010dekamo osloba\u0111anje blokade.<\/p>\n<p>Bez posebnih trikova ne\u0107emo mo\u0107i vidjeti staru verziju podataka u IRIS-u, stoga \u0107emo se morati osloniti na blokade.<\/p>\n<p>Shodno tome, morat \u0107emo uz pomo\u0107 dijeljenih blokada dozvoliti \u010ditanje podataka samo u trenucima dosljednosti.<\/p>\n<p>Pretpostavimo da imamo bazu korisnika ^person, koji si me\u0111usobno transferiraju novac.<\/p>\n<p>Moment transfera od osobe 123 ka osobi 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 zahtjeva za iznosom novca od osobe 123 prije otpisa mora biti pra\u0107en ekskluzivnom blokadom (po defaultu):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nA ako je potrebno prikazati stanje ra\u010duna u korisni\u010dkom su\u010delju, mo\u017ee se koristiti dijeljena blokada ili je uop\u0107e ne koristiti:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nMe\u0111utim, ako pretpostavimo da operacije s bazom podataka odvijaju prakti\u010dki trenutno (podsje\u0107am, globalne promjene su mnogo ni\u017ee razine od relacijskih tablica), potreba za ovim nivoom opada.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 na ovom nivou izolacije dopu\u0161teno je da postoje vi\u0161e \u010ditanja podataka koja mogu biti promijenjena paralelnim transakcijama. <\/p>\n<p>Shodno tome, morat \u0107emo staviti dijeljenu blokadu na \u010ditanje podataka koje mijenjamo i ekskluzivne blokade na podatke koje mijenjamo.<\/p>\n<p>Operator LOCK allows you to list all necessary locks in detail within a single operator, which can be quite numerous.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\"S\"\nreading ^person(123, amount)<\/code><\/pre>\n<p>\nother operations (during this time parallel threads try 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)#\"S\"<\/code><\/pre>\n<p>\nWhen listing locks separated by commas, they are taken sequentially; however, if done this way:<\/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 locks so that ultimately all transactions that involve shared data are executed sequentially. For this approach, most locks should be exclusive and applied to 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 for it, since money must be spent strictly sequentially; otherwise, it's possible to spend the same amount multiple times.<\/p>\n<h2>4. Longevity<\/h2>\n<p>\nI conducted tests by hard-killing the container using<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nThe database handled it well. No problems were identified.<\/p>\n<h2>Zaklju\u010dak<\/h2>\n<p>\nFor globals in InterSystems IRIS, there is support for transactions. They are indeed atomic and reliable. However, ensuring database consistency in globals requires the programmer's effort and the use of transactions, as there are no complex built-in constructs like foreign keys.<\/p>\n<p>The isolation level for globals without using locks is READ UNCOMMITTED, while using locks can ensure it up to the SERIALIZE level.<\/p>\n<p>The correctness and speed of transactions on globals greatly depends on the programmer's skill: the more widely shared locks are used for reading, the higher the isolation level, and the narrower the exclusive locks are applied, the greater the speed.<br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461753\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044b. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 ObjectScript. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u00ab\u0413\u043b\u043e\u0431\u0430\u043b\u044b \u2014 \u043c\u0435\u0447\u0438-\u043a\u043b\u0430\u0434\u0435\u043d\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\u00bb: \u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 1 \u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 2 \u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0427\u0430\u0441\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27448,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36650","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0423\u0411\u0414 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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 InterSystems IRIS Globals | ProHoster","description":"The InterSystems IRIS DBMS supports interesting structures.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}