{"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\/it\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transazioni in globali InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transazioni in globali InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Il DBMS InterSystems IRIS supporta strutture interessanti per l'archiviazione dei dati: i globali. In sostanza, si tratta di chiavi multi-livello con vari vantaggi aggiuntivi come transazioni, funzioni veloci per percorrere alberi di dati, bloccaggi e il proprio linguaggio ObjectScript.<\/p>\n<p>Maggiori dettagli sui globali nella serie di articoli \"Globali - spade magiche per l'archiviazione dei dati\":<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">Alberi. Parte 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">Alberi. Parte 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Array sparsi. Parte 3<\/a><\/noindex><\/p>\n<p>Sono curioso di sapere come sono implementate le transazioni nei globali, quali sono le loro peculiarit\u00e0. Infatti, si tratta di una struttura di archiviazione dei dati completamente diversa dalle Tabelle comunemente conosciute. \u00c8 molto pi\u00f9 a basso livello.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nCome noto dalla teoria dei database relazionali, una buona implementazione delle transazioni deve soddisfare i requisiti <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A - Atomico (atomicit\u00e0).<\/b> Vengono registrate tutte le modifiche apportate nella transazione o nessuna.<\/p>\n<p><b>C - Coerenza (consistenza).<\/b> Dopo il completamento della transazione, lo stato logico del DB deve essere internamente coerente. Molti di questi requisiti riguardano il programmatore, ma nel caso dei database SQL riguardano anche le chiavi esterne.<\/p>\n<p><b>I - Isolato (isolamento).<\/b> Le transazioni eseguite in parallelo non devono influenzarsi a vicenda.<\/p>\n<p><b>D - Durabile (durabilit\u00e0).<\/b> Dopo un completamento riuscito della transazione, problemi a livelli inferiori (come un'interruzione di corrente, per esempio) non devono influire sui dati modificati dalla transazione.<\/p>\n<p>I globali sono strutture dati non relazionali. Sono stati creati per un funzionamento super veloce su hardware molto limitato. Esaminiamo l'implementazione delle transazioni nei globali utilizzando <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">l'immagine docker ufficiale di IRIS<\/a><\/noindex>.<\/p>\n<p>Per supportare le transazioni in IRIS si usano i comandi: <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. Atomarit\u00e0<\/h2>\n<p>\n\u00c8 pi\u00f9 facile testare l'atomicit\u00e0. Verifichiamo dalla console del database.<\/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>\nPoi facciamo un'analisi:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \" \", ^a(2), \" \", ^a(3)<\/code><\/pre>\n<p>\nOtterremo:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nTutto in ordine. L'atomicit\u00e0 \u00e8 rispettata: tutte le modifiche sono state registrate.<\/p>\n<p>Complichiamo il compito, introduciamo un errore e vediamo come viene mantenuta la transazione, parzialmente o per niente.<\/p>\n<p>Controlliamo di nuovo l'atomicit\u00e0:<\/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>\nDopodich\u00e9 fermeremo forzatamente il contenitore, lo riavvieremo e vedremo. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nQuesto comando \u00e8 praticamente equivalente a una interruzione forzata dell'alimentazione, poich\u00e9 invia un segnale di arresto immediato del processo SIGKILL.<\/p>\n<p>Potrebbe essere che la transazione sia stata salvata parzialmente?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 No, non \u00e8 stata salvata.<\/p>\n<p>Proviamo il comando di 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>\nAnche stavolta non \u00e8 stato salvato nulla.<\/p>\n<h2>2. Coerenza<\/h2>\n<p>\nPoich\u00e9 nelle basi sui globali le chiavi vengono create anch'esse sui globali (ricordo che un globale \u00e8 una struttura a livello inferiore per memorizzare dati rispetto a una tabella relazionale), per soddisfare il requisito di coerenza \u00e8 necessario includere la modifica della chiave nella stessa transazione che modifica il globale.<\/p>\n<p>Ad esempio, abbiamo un globale ^person, in cui memorizziamo le personalit\u00e0 e come chiave utilizziamo il codice fiscale.<\/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>\nPer avere una ricerca veloce per cognome e nome abbiamo creato la chiave ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nAffinch\u00e9 la base sia coerente dobbiamo aggiungere le personalit\u00e0 in questo modo:<\/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>\nPertanto, durante l'eliminazione dobbiamo anche utilizzare una transazione:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nIn altre parole, il rispetto del requisito di coerenza ricade completamente sulle spalle del programmatore. Ma quando si tratta di globali, questo \u00e8 normale, a causa della loro natura a livello inferiore.<\/p>\n<h2>3. Isolamento<\/h2>\n<p>\nQui iniziano le complicazioni. Molti utenti lavorano contemporaneamente sulla stessa base, modificando gli stessi dati.<\/p>\n<p>La situazione \u00e8 paragonabile a quando molti utenti lavorano contemporaneamente su un unico repository di codice e tentano di fare commit delle modifiche in molti file allo stesso tempo.<\/p>\n<p>Il database deve gestire tutto questo in tempo reale. Considerando che nelle aziende serie c'\u00e8 persino una persona dedicata al controllo delle versioni (alla fusione dei rami, alla risoluzione dei conflitti, ecc.), e il DB deve fare tutto questo in tempo reale, diventa ovvio la complessit\u00e0 del compito e la correttezza della progettazione del database e del codice che lo gestisce.<\/p>\n<p>Il database non pu\u00f2 comprendere il significato delle azioni effettuate dagli utenti per evitare conflitti quando lavorano sugli stessi dati. Pu\u00f2 solo annullare una transazione che contraddice un'altra o eseguirle in modo sequenziale.<\/p>\n<p>Un altro problema \u00e8 che durante l'esecuzione di una transazione (fino al commit), lo stato del database pu\u00f2 essere incoerente. Pertanto, \u00e8 preferibile che altre transazioni non abbiano accesso a uno stato incoerente del database, cosa che si realizza nei database relazionali in molti modi: creando snapshot, utilizzando la multiversione delle righe, ecc.<\/p>\n<p>Nell'esecuzione parallela delle transazioni \u00e8 importante che non si interferiscano reciprocamente. Questa \u00e8 la propriet\u00e0 di isolamento.<\/p>\n<p>SQL definisce 4 livelli di isolamento:<\/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>\nEsaminiamo ogni livello singolarmente. I costi per l'implementazione di ciascun livello aumentano quasi esponenzialmente.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 \u00e8 il livello pi\u00f9 basso di isolamento, ma \u00e8 anche il pi\u00f9 veloce. Le transazioni possono leggere le modifiche apportate l'una dall'altra.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 \u00e8 il livello successivo di isolamento, che rappresenta un compromesso. Le transazioni non possono leggere le modifiche apportate l'una dall'altra fino al commit, ma possono leggere qualsiasi modifica apportata dopo il commit.<\/p>\n<p>Se abbiamo una lunga transazione T1, durante la quale ci sono stati commit nelle transazioni T2, T3 \u2026 Tn, che hanno lavorato con gli stessi dati di T1, all'interrogazione dei dati in T1 otterremo ogni volta risultati diversi. Questo fenomeno si chiama lettura non ripetibile.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 a questo livello di isolamento non abbiamo il fenomeno della lettura non ripetibile grazie al fatto che per ogni richiesta di lettura dei dati viene creato uno snapshot dei risultati e quando vengono riutilizzati nella stessa transazione vengono utilizzati i dati dello snapshot. Tuttavia, a questo livello di isolamento \u00e8 possibile leggere dati fantasma, intendendo la lettura di nuove righe aggiunte da transazioni parallele gi\u00e0 fissate.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 \u00e8 il livello pi\u00f9 alto di isolamento. \u00c8 caratterizzato dal fatto che i dati utilizzati in qualche modo nella transazione (lettura o modifica) diventano disponibili per altre transazioni solo dopo il completamento della prima transazione.<\/p>\n<p>Iniziamo a capire se c'\u00e8 isolamento delle operazioni nella transazione rispetto al flusso principale. Apriamo 2 finestre del terminale.<\/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>\nNon c'\u00e8 isolamento. Un flusso vede ci\u00f2 che fa l'altro che ha aperto la transazione.<\/p>\n<p>Vediamo se le transazioni di flussi diversi vedono ci\u00f2 che accade all'interno di esse. <\/p>\n<p>Apriamo 2 finestre del terminale e apriamo 2 transazioni in parallelo.<\/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>\nLe transazioni parallele vedono i dati l'una dell'altra. Quindi abbiamo ottenuto il livello di isolamento pi\u00f9 semplice, ma anche il pi\u00f9 veloce, READ UNCOMMITTED.<\/p>\n<p>In linea di principio, ci\u00f2 era prevedibile per i globali, per i quali le prestazioni sono sempre state una priorit\u00e0. <\/p>\n<p>Cosa fare se abbiamo bisogno di un livello di isolamento pi\u00f9 elevato nelle operazioni sui globali?<\/p>\n<p>Qui dobbiamo riflettere sul perch\u00e9 abbiamo bisogno di livelli di isolamento e su come funzionano.<\/p>\n<p>Il livello di isolamento pi\u00f9 alto, SERIALIZE, significa che il risultato delle transazioni eseguite in parallelo \u00e8 equivalente alla loro esecuzione sequenziale, garantendo l'assenza di collisioni.<\/p>\n<p>Possiamo farlo grazie a blocchi appropriati in ObjectScript, che hanno molti modi diversi di applicazione: \u00e8 possibile fare un blocco normale, incrementale o multiplo con il comando <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>Livelli di isolamento inferiori sono compromessi volti ad aumentare la velocit\u00e0 di funzionamento del database.<\/p>\n<p>Vediamo come possiamo raggiungere diversi livelli di isolamento tramite blocchi.<\/p>\n<p>Questo operatore consente di avere non solo blocchi esclusivi necessari per modificare i dati, ma anche i cosiddetti blocchi condivisi, che possono essere acquisiti simultaneamente da pi\u00f9 flussi quando devono leggere dati che non devono essere modificati da altri processi durante la lettura.<\/p>\n<p>Maggiore informazioni sul metodo di blocco a due fasi in russo e inglese:<\/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\">Blocco a due fasi<\/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>La difficolt\u00e0 sta nel fatto che durante la transazione lo stato del database pu\u00f2 essere incoerente, tuttavia questi dati incoerenti sono visibili ad altri processi. Come evitarlo?<\/p>\n<p>Lo faremo con blocchi per creare finestre di visibilit\u00e0 in cui lo stato del database sar\u00e0 coerente. E tutte le richieste a tali finestre di visibilit\u00e0 di stato coerente saranno controllate dai blocchi.<\/p>\n<p>Le blocchi condivisi su dati identici sono riutilizzabili: possono essere acquisiti da pi\u00f9 processi. Questi blocchi vietano ad altri processi di modificare i dati, cio\u00e8 vengono utilizzati per formare finestre di stato coerente del database.<\/p>\n<p>I blocchi esclusivi vengono impiegati per modificare i dati: tale blocco pu\u00f2 essere acquisito solo da un processo. Un blocco esclusivo pu\u00f2 essere acquisito da:<\/p>\n<ol>\n<li>Qualsiasi processo, se i dati sono liberi.<\/li>\n<li>Solo quel processo che ha un blocco condiviso su tali dati e ha richiesto per primo un blocco esclusivo.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transazioni in globali InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPi\u00f9 ristretta \u00e8 la finestra di visibilit\u00e0, pi\u00f9 a lungo gli altri processi devono attendere, ma cos\u00ec lo stato del database pu\u00f2 risultare pi\u00f9 coerente al suo interno.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 l'essenza di questo livello \u00e8 che vediamo solo dati gi\u00e0 confermati da altri flussi. Se i dati in un'altra transazione non sono ancora stati confermati, vediamo la loro vecchia versione.<\/p>\n<p>Questo ci permette di parallelizzare il lavoro invece di attendere il rilascio del blocco.<\/p>\n<p>Senza particolari accorgimenti non saremo in grado di vedere la vecchia versione dei dati in IRIS, quindi dovremo fare affidamento sui blocchi.<\/p>\n<p>Di conseguenza, dovremo autorizzare la lettura dei dati solo nei momenti di coerenza tramite blocchi condivisi.<\/p>\n<p>Supponiamo di avere un database di utenti ^person, che si trasferiscono denaro tra di loro.<\/p>\n<p>Il momento del trasferimento da persona 123 a persona 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>\nIl momento in cui si richiede la quantit\u00e0 di denaro da persona 123 prima di un addebito deve essere accompagnato da un blocco esclusivo (per impostazione predefinita):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nSe \u00e8 necessario mostrare lo stato del conto nel pannello personale, si pu\u00f2 usare un blocco condiviso o addirittura non usarlo affatto:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nTuttavia, ammettendo che le operazioni di interazione con il database avvengano praticamente istantaneamente (ricordo che i global sono una struttura molto pi\u00f9 a basso livello rispetto a una tabella relazionale), la necessit\u00e0 di questo livello diminuisce.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 in questo livello di isolamento \u00e8 permesso che ci possano essere pi\u00f9 letture di dati che possono essere modificate da transazioni parallele. <\/p>\n<p>Di conseguenza, sar\u00e0 necessario impostare un blocco condiviso per la lettura dei dati che stiamo modificando e blocchi esclusivi per i dati che stiamo cambiando.<\/p>\n<p>Il vantaggio dell'operatore LOCK \u00e8 che consente di elencare in modo dettagliato tutte le serrature necessarie in un unico operatore, che possono essere molte.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nlettura ^person(123, amount)<\/code><\/pre>\n<p>\naltre operazioni (in questo momento i thread paralleli stanno cercando di modificare ^person(123, amount), ma non possono)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nmodifica ^person(123, amount)\nLOCK -^person(123, amount)\n\nlettura ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nQuando si elencano le serrature con una virgola, vengono prese in sequenza, ma se si fa cos\u00ec:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\nallora vengono prese atomiche tutte insieme.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 dobbiamo impostare le serrature in modo che alla fine tutte le transazioni che hanno dati comuni vengano eseguite in sequenza. Per questo approccio, la maggior parte delle serrature deve essere esclusiva e presa sulle aree pi\u00f9 piccole del globale per prestazioni.<\/p>\n<p>Se parliamo di prelievi di fondi nel globale ^person, solo il livello di isolamento SERIALIZE \u00e8 accettabile, poich\u00e9 il denaro deve essere speso in modo strettamente sequenziale, altrimenti \u00e8 possibile spendere la stessa somma pi\u00f9 volte.<\/p>\n<h2>4. Durabilit\u00e0<\/h2>\n<p>\nHo effettuato test con l'interruzione brusca del contenitore tramite<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nIl database ha gestito bene. Non sono stati riscontrati problemi.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nPer i globali in InterSystems IRIS c'\u00e8 il supporto per le transazioni. Sono davvero atomiche, affidabili. Per garantire la coerenza del DB nei globali sono necessari gli sforzi del programmatore e l'uso delle transazioni, poich\u00e9 non ci sono strutture complesse integrate come le chiavi esterne.<\/p>\n<p>Il livello di isolamento per i globali senza l'uso di serrature \u00e8 READ UNCOMMITED, mentre con le serrature pu\u00f2 essere garantito fino al livello SERIALIZE.<\/p>\n<p>La correttezza e la velocit\u00e0 delle transazioni sui globali dipendono molto dall'abilit\u00e0 del programmatore: pi\u00f9 ampiamente vengono utilizzate le serrature shared durante la lettura, maggiore \u00e8 il livello di isolamento, e pi\u00f9 ristrettamente vengono prese le serrature esclusive, maggiore \u00e8 la velocit\u00e0.<br \/>\n<br \/>Fonte: <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.1.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\/it\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Transazioni nei globali InterSystems IRIS | ProHoster","description":"Il DBMS InterSystems IRIS supporta strutture interessanti.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}