{"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\/ro\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Tranzac\u021bii \u00een globalurile InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tranzac\u021bii \u00een globalurile InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>SGBD InterSystems IRIS sus\u021bine structuri interesante pentru stocarea datelor - globale. Practic, acestea sunt chei multilaterale cu diverse avantaje suplimentare, precum tranzac\u021bii, func\u021bii rapide pentru navigarea \u00een arborii de date, blocaje \u0219i un limbaj propriu, ObjectScript.<\/p>\n<p>Mai multe despre globale \u00een seria de articole \u201eGlobale - s\u0103bii cu dou\u0103 t\u0103i\u0219uri pentru stocarea datelor\u201d:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Arbori. Partea 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Arbori. Partea 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Matrice sparse. Partea 3<\/a><\/noindex><\/p>\n<p>M-a interesat cum sunt implementate tranzac\u021biile \u00een globale, ce caracteristici au. Este o structur\u0103 complet diferit\u0103 pentru stocarea datelor, comparativ cu tabelele obi\u0219nuite. Mult mai la un nivel de baz\u0103.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDup\u0103 cum se \u0219tie din teoria bazelor de date rela\u021bionale, o implementare bun\u0103 a tranzac\u021biilor ar trebui s\u0103 \u00eendeplineasc\u0103 cerin\u021bele <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A - Atomic (atomaritate).<\/b> Toate modific\u0103rile efectuate \u00een tranzac\u021bie trebuie \u00eenregistrate sau niciuna.<\/p>\n<p><b>C - Consistency (consisten\u021b\u0103).<\/b> Dup\u0103 finalizarea tranzac\u021biei, starea logic\u0103 a bazei de date trebuie s\u0103 fie intern coerent\u0103. \u00cen mare parte, aceast\u0103 cerin\u021b\u0103 se refer\u0103 la programator, dar \u00een cazul bazelor de date SQL se refer\u0103 \u0219i la cheile externe.<\/p>\n<p><b>I - Isolate (izolare).<\/b> Tranzac\u021biile care se execut\u0103 simultan nu trebuie s\u0103 se influen\u021beze reciproc.<\/p>\n<p><b>D - Durable (durabilitate).<\/b> Dup\u0103 finalizarea cu succes a tranzac\u021biei, problemele de la nivelurile inferioare (de exemplu, o c\u0103dere a aliment\u0103rii) nu trebuie s\u0103 afecteze datele modificate de tranzac\u021bie.<\/p>\n<p>Globalele sunt structuri de date nerela\u021bionale. Au fost create pentru a func\u021biona extrem de rapid pe hardware foarte limitat. S\u0103 analiz\u0103m implementarea tranzac\u021biilor \u00een globale folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">imaginea oficial\u0103 Docker IRIS<\/a><\/noindex>.<\/p>\n<p>Pentru a sus\u021bine tranzac\u021biile \u00een IRIS, sunt folosite comenzile: <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. Atomaritate<\/h2>\n<p>\nCel mai u\u0219or de verificat este atomaritatea. Verific\u0103m din consola bazei de date.<\/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>\nApoi facem concluzia:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nVom ob\u021bine:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nTotul este \u00een regul\u0103. Atomaritatea a fost respectat\u0103: toate modific\u0103rile au fost \u00eenregistrate.<\/p>\n<p>S\u0103 complic\u0103m pu\u021bin sarcina, introduc\u00e2nd o eroare \u0219i s\u0103 vedem cum se va p\u0103stra tranzac\u021bia, par\u021bial sau deloc.<\/p>\n<p>Verific\u0103m din nou atomaritatea:<\/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>\nDup\u0103 care vom opri for\u021bat containerul, \u00eel vom porni \u0219i vom verifica. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nAceast\u0103 comand\u0103 este practic echivalent\u0103 cu oprirea for\u021bat\u0103 a aliment\u0103rii, deoarece trimite semnalul de oprire imediat\u0103 a procesului SIGKILL.<\/p>\n<p>Poate c\u0103 tranzac\u021bia a fost salvat\u0103 par\u021bial?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nu, nu s-a salvat.<\/p>\n<p>S\u0103 test\u0103m comanda de rollback:<\/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>\nNici asta nu s-a salvat.<\/p>\n<h2>2. Consisten\u021ba<\/h2>\n<p>\nDeoarece \u00een bazele de date pe globale, cheile sunt de asemenea create pe globale (amintesc c\u0103 globalul este o structur\u0103 de nivel inferior pentru stocarea datelor, comparativ cu o tabel\u0103 rela\u021bional\u0103), pentru a \u00eendeplini cerin\u021ba de consisten\u021b\u0103, modificarea cheii trebuie inclus\u0103 \u00een aceea\u0219i tranzac\u021bie cu modificarea globalului.<\/p>\n<p>De exemplu, avem globalul ^person, \u00een care stoc\u0103m persoanele \u0219i folosim ca \u0219i cheie CNP-ul.<\/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>\nPentru a avea c\u0103ut\u0103ri rapide dup\u0103 nume \u0219i prenume, am creat cheia ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nPentru ca baza de date s\u0103 fie consistent\u0103, trebuie s\u0103 ad\u0103ug\u0103m persoana astfel:<\/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>\nPrin urmare, la \u0219tergere, trebuie de asemenea s\u0103 folosim o tranzac\u021bie:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nCu alte cuvinte, \u00eendeplinirea cerin\u021bei de consisten\u021b\u0103 este complet pe umerii programatorului. Dar c\u00e2nd vine vorba de globale, este normal, din cauza naturii lor de nivel inferior.<\/p>\n<h2>3. Izolarea<\/h2>\n<p>\nAici \u00eencep problemele. Mul\u021bi utilizatori lucreaz\u0103 simultan asupra acelea\u0219i baze de date, modific\u00e2nd acelea\u0219i date.<\/p>\n<p>Situa\u021bia este comparabil\u0103 cu aceea \u00een care mul\u021bi utilizatori lucreaz\u0103 simultan cu acela\u0219i repository de cod \u0219i \u00eencearc\u0103 s\u0103 comiteze modific\u0103ri \u00een multe fi\u0219iere \u00een acela\u0219i timp.<\/p>\n<p>Baza de date trebuie s\u0103 gestioneze totul \u00een timp real. Av\u00e2nd \u00een vedere c\u0103 \u00een companiile mari exist\u0103 chiar o persoan\u0103 responsabil\u0103 de controlul versiunilor (pentru a gestiona fuziunile ramurilor, rezolvarea conflictelor etc.), iar baza de date trebuie s\u0103 fac\u0103 tot acest lucru \u00een timp real, devine evident\u0103 complexitatea sarcinii \u0219i corectitudinea proiect\u0103rii bazei de date \u0219i a codului care o \u00eentre\u021bine.<\/p>\n<p>O baz\u0103 de date nu poate \u00een\u021belege sensul ac\u021biunilor efectuate de utilizatori pentru a preveni conflictele atunci c\u00e2nd ace\u0219tia lucreaz\u0103 cu acelea\u0219i date. Aceasta poate anula o tranzac\u021bie care contrazice alta sau poate s\u0103 le execute secven\u021bial.<\/p>\n<p>O alt\u0103 problem\u0103 este c\u0103, \u00een timpul execu\u021biei unei tranzac\u021bii (p\u00e2n\u0103 la commit), starea bazei de date poate fi inconsistenta. Din acest motiv, este de dorit ca alte tranzac\u021bii s\u0103 nu aib\u0103 acces la starea inconsistent\u0103 a bazei de date, ceea ce se realizeaz\u0103 \u00een bazele de date rela\u021bionale prin mai multe metode: crearea de snapshot-uri, gestionarea versiunilor multiple a r\u00e2ndurilor etc.<\/p>\n<p>C\u00e2nd tranzac\u021biile sunt executate \u00een paralel, este important s\u0103 nu se interfereze reciproc. Acesta este ceea ce se nume\u0219te proprietatea izola\u021biei.<\/p>\n<p>SQL define\u0219te 4 niveluri de izola\u021bie:<\/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>\nS\u0103 analiz\u0103m fiecare nivel \u00een parte. Costurile de implementare ale fiec\u0103rui nivel cresc aproape exponen\u021bial.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 acesta este cel mai sc\u0103zut nivel de izola\u021bie, dar \u0219i cel mai rapid. Tranzac\u021biile pot citi modific\u0103rile efectuate de celelalte.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 acesta este urm\u0103torul nivel de izola\u021bie, care reprezint\u0103 un compromis. Tranzac\u021biile nu pot citi modific\u0103rile efectuate de celelalte p\u00e2n\u0103 la commit, dar pot citi orice modific\u0103ri efectuate dup\u0103 commit.<\/p>\n<p>Dac\u0103 avem o tranzac\u021bie lung\u0103 T1, \u00een timpul c\u0103reia au avut loc commit-uri \u00een tranzac\u021biile T2, T3... Tn, care au lucrat cu acelea\u0219i date ca \u0219i T1, atunci la solicitarea datelor din T1, vom ob\u021bine de fiecare dat\u0103 un rezultat diferit. Acest fenomen se nume\u0219te citire ne-repetabil\u0103.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 \u00een acest nivel de izola\u021bie, nu avem fenomenul citirii ne-repetabile, datorit\u0103 faptului c\u0103 pentru fiecare solicitare de citire a datelor se creeaz\u0103 un snapshot al rezultatelor, iar pentru reutilizarea \u00een aceea\u0219i tranzac\u021bie se folosesc datele din snapshot. Totu\u0219i, \u00een acest nivel de izola\u021bie este posibil\u0103 citirea datelor fantom\u0103. Aceasta se refer\u0103 la citirea unor r\u00e2nduri noi, care au fost ad\u0103ugate de tranzac\u021bii paralele confirmate.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 cel mai \u00eenalt nivel de izola\u021bie. Acesta se caracterizeaz\u0103 prin faptul c\u0103 datele utilizate \u00een moduri diferite \u00een tranzac\u021bie (citire sau modificare) devin accesibile altor tranzac\u021bii doar dup\u0103 finalizarea primei tranzac\u021bii.<\/p>\n<p>Pentru \u00eenceput, s\u0103 ne asigur\u0103m dac\u0103 exist\u0103 izolare a opera\u021biunilor \u00een tranzac\u021bie fa\u021b\u0103 de fluxul principal. Vom deschide 2 feronete de terminal.<\/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>\nNu exist\u0103 izolare. Un flux poate vedea ce face cel\u0103lalt care a deschis tranzac\u021bia.<\/p>\n<p>S\u0103 vedem dac\u0103 tranzac\u021biile din fluxuri diferite v\u0103d ceea ce se \u00eent\u00e2mpl\u0103 \u00een interiorul lor. <\/p>\n<p>Vom deschide 2 feronete de terminal \u0219i vom deschide 2 tranzac\u021bii \u00een paralel.<\/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>\nTranzac\u021biile paralele v\u0103d datele unui alt. A\u0219adar, am ob\u021binut cel mai simplu, dar \u0219i cel mai rapid nivel de izolare READ UNCOMMITED.<\/p>\n<p>\u00cen principiu, acest lucru era de a\u0219teptat pentru globale, pentru care performan\u021ba a fost \u00eentotdeauna prioritar\u0103. <\/p>\n<p>Ce facem dac\u0103 avem nevoie de un nivel mai \u00eenalt de izolare \u00een opera\u021biunile globale?<\/p>\n<p>Aici trebuie s\u0103 ne g\u00e2ndim de ce avem nevoie de niveluri de izolare \u0219i cum func\u021bioneaz\u0103 ele.<\/p>\n<p>Cel mai \u00eenalt nivel de izolare SERIALIZE \u00eenseamn\u0103 c\u0103 rezultatul tranzac\u021biilor executate \u00een paralel este echivalent execut\u0103rii lor secven\u021bial, ceea ce garanteaz\u0103 absen\u021ba coliziunilor.<\/p>\n<p>Acest lucru putem realiza prin bloc\u0103ri inteligente \u00een ObjectScript, care au o mul\u021bime de metode diverse de aplicare: putemface o blocare obi\u0219nuit\u0103, incremental\u0103 sau multipl\u0103 cu comanda <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>Nivelurile mai sc\u0103zute de izolare sunt compromituri menite s\u0103 creasc\u0103 viteza de func\u021bionare a bazei de date.<\/p>\n<p>S\u0103 vedem cum putem ob\u021bine diferite niveluri de izolare cu ajutorul bloc\u0103rilor.<\/p>\n<p>Acest operator permite ob\u021binerea nu doar a bloc\u0103rilor exclusive, necesare pentru modificarea datelor, ci \u0219i a celor denumite shared, care pot fi ob\u021binute simultan de mai multe fluxuri atunci c\u00e2nd trebuie s\u0103 citeasc\u0103 date care nu ar trebui s\u0103 fie modificate de alte procese \u00een timpul citirii.<\/p>\n<p>Mai multe informa\u021bii despre metoda de blocare \u00een dou\u0103 faze \u00een limbile rom\u00e2n\u0103 \u0219i englez\u0103:<\/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\">Blocare \u00een dou\u0103 faze<\/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>Dificultatea const\u0103 \u00een faptul c\u0103, \u00een timpul tranzac\u021biei, starea bazei poate fi nesolicitat\u0103, \u00eens\u0103 aceste date nesolicitate sunt vizibile altor procese. Cum putem evita asta?<\/p>\n<p>Vom crea prin bloc\u0103ri feronete de vizibilitate \u00een care starea bazei va fi conform\u0103. \u0218i toate apelurile la aceste feronete de vizibilitate a st\u0103rii conforme vor fi controlate prin intermediul bloc\u0103rilor.<\/p>\n<p>Bloc\u0103rile partajate de date sunt reutilizabile \u2014 pot fi accesate de mai multe procese. Aceste bloc\u0103ri \u00eempiedic\u0103 alte procese s\u0103 modifice datele, adic\u0103 sunt folosite pentru a forma feroneria unui stat coerent al bazei de date.<\/p>\n<p>Bloc\u0103rile exclusive sunt utilizate pentru modificarea datelor \u2014 o astfel de blocare poate fi ob\u021binut\u0103 doar de un singur proces. O blocare exclusiv\u0103 poate fi ob\u021binut\u0103 de:<\/p>\n<ol>\n<li>Orice proces, dac\u0103 datele sunt libere<\/li>\n<li>Numai procesul care are pe aceste date o blocare partajat\u0103 \u0219i a cerut prima dat\u0103 blocarea exclusiv\u0103.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Tranzac\u021bii \u00een globalurile InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCu c\u00e2t fereastra de vizibilitate este mai \u00eengust\u0103, cu at\u00e2t trebuie s\u0103 a\u0219tepte mai mult alte procese, dar cu at\u00e2t mai coerent poate fi statul bazei de date \u00een ea.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 esen\u021ba acestui nivel este c\u0103 vedem doar datele confirmate din alte fluxuri. Dac\u0103 datele dintr-o alt\u0103 tranzac\u021bie nu sunt \u00eenc\u0103 confirmate, atunci vedem versiunea lor veche.<\/p>\n<p>Aceasta ne permite s\u0103 desf\u0103\u0219ur\u0103m lucr\u0103rile \u00een paralel \u00een loc s\u0103 a\u0219tept\u0103m eliberarea bloc\u0103rii.<\/p>\n<p>F\u0103r\u0103 trucuri speciale, nu vom putea vedea versiunea veche a datelor \u00een IRIS, a\u0219a c\u0103 va trebui s\u0103 ne descurc\u0103m cu bloc\u0103rile.<\/p>\n<p>Prin urmare, va fi necesar s\u0103 permitem citirea datelor doar \u00een momentele de coeren\u021b\u0103 cu bloc\u0103rile partajate.<\/p>\n<p>S\u0103 presupunem c\u0103 avem o baz\u0103 de date a utilizatorilor ^person, care \u00ee\u0219i transfer\u0103 bani \u00eentre ei.<\/p>\n<p>Momentul transferului de la persoana 123 la persoana 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>\nMomentul cererii sumei de bani la persoana 123 \u00eenainte de debitare trebuie s\u0103 fie \u00eenso\u021bit de o blocare exclusiv\u0103 (implicit):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\n\u0218i dac\u0103 trebuie s\u0103 ar\u0103t\u0103m starea contului \u00een spa\u021biul personal, putem folosi o blocare partajat\u0103 sau s\u0103 nu o folosim deloc:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nCu toate acestea, dac\u0103 presupunem c\u0103 opera\u021biile cu baza de date se efectueaz\u0103 practic instantaneu (s\u0103 reamintim c\u0103 globalele sunt o structur\u0103 de nivel mai sc\u0103zut dec\u00e2t tabelul rela\u021bional), atunci necesitatea acestui nivel scade.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 la acest nivel de izolare se permite faptul c\u0103 pot exista mai multe citiri de date care pot fi modificate de tranzac\u021bii paralele. <\/p>\n<p>Prin urmare, va trebui s\u0103 punem o blocare partajat\u0103 la citirea datelor pe care le modific\u0103m \u0219i bloc\u0103ri exclusive pe datele pe care le schimb\u0103m.<\/p>\n<p>Operatorul LOCK permite enumerarea detaliat\u0103 a tuturor bloc\u0103rilor necesare printr-un singur operator, care poate fi foarte numeros.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nlectur\u0103 ^person(123, amount)<\/code><\/pre>\n<p>\nalte opera\u021biuni (\u00een acest timp, firele paralele \u00eencearc\u0103 s\u0103 modifice ^person(123, amount), dar nu pot)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nmodificare ^person(123, amount)\nLOCK -^person(123, amount)\n\nlectur\u0103 ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nC\u00e2nd enumer\u0103m bloc\u0103rile folosind virgul\u0103, acestea sunt preluate secven\u021bial, iar dac\u0103 se face astfel:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\natunci acestea sunt preluate atomic toate deodat\u0103.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 va trebui s\u0103 stabilim bloc\u0103rile astfel \u00eenc\u00e2t, \u00een final, toate tranzac\u021biile care au date comune s\u0103 fie executate secven\u021bial. Pentru aceast\u0103 abordare, majoritatea bloc\u0103rilor trebuie s\u0103 fie exclusive \u0219i preluate pe cele mai mici zone globale pentru performan\u021b\u0103.<\/p>\n<p>Dac\u0103 vorbim despre retragerile de fonduri \u00een globalul ^person, atunci pentru acesta este acceptabil doar nivelul de izolare SERIALIZE, deoarece banii trebuie cheltui\u021bi strict secven\u021bial, altfel este posibil s\u0103 cheltuim aceea\u0219i sum\u0103 de mai multe ori.<\/p>\n<h2>4. Durabilitate<\/h2>\n<p>\nAm efectuat teste cu \u00eentreruperea brusc\u0103 a containerului prin<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nBaza s-a descurcat bine. Nu s-au identificat probleme.<\/p>\n<h2>Concluzie<\/h2>\n<p>\nPentru globaluri \u00een InterSystems IRIS exist\u0103 suport pentru tranzac\u021bii. Acestea sunt cu adev\u0103rat atomice, sigure. Pentru a asigura coeren\u021ba BDR \u00een globaluri, sunt necesare eforturile programatorului \u0219i utilizarea tranzac\u021biilor, deoarece nu exist\u0103 construc\u021bii complexe \u00eencorporate, cum ar fi cheile externe.<\/p>\n<p>Nivelul de izolare al globalurilor f\u0103r\u0103 utilizarea bloc\u0103rilor este READ UNCOMMITED, iar prin utilizarea bloc\u0103rilor se poate asigura inclusiv la nivelul SERIALIZE.<\/p>\n<p>Corectitudinea \u0219i viteza de func\u021bionare a tranzac\u021biilor pe globaluri depind foarte mult de priceperea programatorului: cu c\u00e2t se folosesc mai mult bloc\u0103rile shared la citire, cu at\u00e2t nivelul de izolare este mai mare, iar cu c\u00e2t se iau mai pu\u021bin bloc\u0103rile exclusive, cu at\u00e2t mai mult\u0103 rapiditate.<br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Tranzac\u021bii \u00een globaluri InterSystems IRIS | ProHoster","description":"SGBD InterSystems IRIS suport\u0103 structuri interesante.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}