{"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 nei globali di InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transazioni nei globali di InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Il DBMS InterSystems IRIS supporta strutture interessanti per la memorizzazione dei dati: i globali. Essi sono in sostanza chiavi multilivello con vari benefici, come transazioni, funzioni rapide per navigare gli alberi di dati, blocchi e il proprio linguaggio ObjectScript.<\/p>\n<p>Scopri di pi\u00f9 sui globali nella serie di articoli \u00abI globali: spade e tesori per la memorizzazione dei dati\u00bb:<\/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 come siano implementate le transazioni nei globali e quali caratteristiche presentino. Infatti, si tratta di una struttura di memorizzazione dei dati completamente diversa rispetto alle comunemente usate tabelle. Molto pi\u00f9 a basso livello.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nCome \u00e8 noto nella 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 \u2014 Atomicit\u00e0 (Atomic).<\/b> Tutte le modifiche apportate nella transazione vengono registrate, oppure nessuna.<\/p>\n<p><b>C \u2014 Coerenza (Consistency).<\/b> Dopo il completamento della transazione, lo stato logico del database deve essere internamente consistente. In gran parte questo requisito riguarda il programmatore, ma nel caso dei database SQL riguarda anche le chiavi esterne.<\/p>\n<p><b>I \u2014 Isolamento (Isolation).<\/b> Le transazioni che vengono eseguite in parallelo non devono influenzarsi reciprocamente.<\/p>\n<p><b>D \u2014 Durable (durata).<\/b> Dopo il completamento con successo di una transazione, problemi a livelli inferiori (come un'interruzione di corrente) non devono influenzare i dati modificati dalla transazione.<\/p>\n<p>I globali sono strutture di dati non relazionali. Sono stati creati per funzionare in modo estremamente 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 utilizzano 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. Atomicit\u00e0<\/h2>\n<p>\n\u00c8 pi\u00f9 facile verificare l'atomicit\u00e0. Facciamo un controllo 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>\nDopo di che possiamo trarre la conclusione:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nOtterremo:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nTutto a posto. L'atomicit\u00e0 \u00e8 stata rispettata: tutte le modifiche sono state salvate.<\/p>\n<p>Complichiamo la situazione, introduciamo un errore e vediamo come si comporta la transazione, se sar\u00e0 salvata parzialmente o per nulla.<\/p>\n<p>Verifichiamo 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>\nDopo di che fermeremo forzatamente il container, lo riavvieremo e vedremo. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nQuesto comando \u00e8 praticamente equivalente a un'interruzione dell'alimentazione forzata, poich\u00e9 invia il segnale di arresto immediato del processo SIGKILL.<\/p>\n<p>Potrebbe essersi salvata parzialmente la transazione?<\/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>\nNiente \u00e8 stato salvato nemmeno questa volta.<\/p>\n<h2>2. Coerenza<\/h2>\n<p>\nPoich\u00e9 nelle basi sui globali le chiavi vengono create anche sui globali (ricordo che un globale \u00e8 una struttura di livello inferiore per l'archiviazione dei dati rispetto a una tabella relazionale), per soddisfare i requisiti di coerenza \u00e8 necessario includere la modifica della chiave nella stessa transazione della modifica del globale.<\/p>\n<p>Per esempio, abbiamo il globale ^person, in cui archiviamosoggetti e utilizziamo il codice fiscale come chiave.<\/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>\nPer avere una ricerca rapida per cognome e nome abbiamo creato la chiave ^index.<\/p>\n<pre><code class=\"bash\">^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567) = 1<\/code><\/pre>\n<p>\nPer garantire che il database sia coerente dobbiamo aggiungere la personalit\u00e0 in questo modo:<\/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>\nDi conseguenza, durante l'eliminazione dobbiamo utilizzare anche una transazione:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index(\u2018Kamenev\u2019, \u2018Sergey\u2019, 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nIn altre parole, l'esecuzione della necessit\u00e0 di coerenza ricade interamente sulle spalle del programmatore. Ma quando si tratta di variabili globali, questo \u00e8 normale a causa della loro natura a basso livello.<\/p>\n<h2>3. Isolamento<\/h2>\n<p>\nQui iniziano le complicazioni. Molti utenti lavorano contemporaneamente sulla stessa base di dati, modificando gli stessi dati.<\/p>\n<p>La situazione \u00e8 paragonabile a quella in cui molti utenti lavorano contemporaneamente su un unico repository di codice e cercano di eseguire commit di modifiche in molti file allo stesso tempo.<\/p>\n<p>Il database deve gestire tutto in tempo reale. Considerando che nelle aziende importanti esiste anche una persona dedicata al controllo delle versioni (per la fusione dei rami, la risoluzione dei conflitti, ecc.), e che il database deve fare tutto questo in tempo reale, diventa evidente la complessit\u00e0 del compito e l'importanza di progettare correttamente il database e il codice che lo gestisce.<\/p>\n<p>Il database non pu\u00f2 comprendere il significato delle azioni degli utenti per evitare conflitti se lavorano sugli stessi dati. Pu\u00f2 solo annullare una transazione che contraddice un'altra o eseguirle in sequenza.<\/p>\n<p>Un ulteriore problema \u00e8 che durante l'esecuzione di una transazione (prima del commit), lo stato del database pu\u00f2 essere incoerente, quindi \u00e8 preferibile che altre transazioni non abbiano accesso a uno stato incoerente del database. Questo obiettivo viene raggiunto nei database relazionali in vari modi: creando snapshot, utilizzando la multiversione delle righe, ecc.<\/p>\n<p>Durante l'esecuzione parallela delle transazioni, \u00e8 importante che queste non interferiscano l'una con l'altra. 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 di implementazione di ciascun livello aumentano quasi esponenzialmente.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 \u00e8 il livello pi\u00f9 basso di isolamento, ma 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 tutte le modifiche apportate dopo il commit.<\/p>\n<p>Se abbiamo una lunga transazione T1, durante la quale sono avvenuti commit nelle transazioni T2, T3\u2026 Tn, che hanno lavorato con gli stessi dati di T1, quando richiediamo dati in T1, riceveremo ogni volta risultati diversi. Questo fenomeno \u00e8 noto come lettura non ripetibile.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 in questo livello di isolamento non abbiamo il fenomeno della lettura non ripetibile, poich\u00e9 per ogni richiesta di lettura dei dati viene creato un'immagine dei dati risultanti e, nel riutilizzo durante la stessa transazione, vengono utilizzati i dati dell'immagine. Tuttavia, in questo livello di isolamento \u00e8 possibile la lettura di dati fantasma. Si intende la lettura di nuove righe che sono state aggiunte da transazioni parallele gi\u00e0 confermate.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 il livello pi\u00f9 alto di isolamento. \u00c8 caratterizzato dal fatto che i dati utilizzati in qualche modo nella transazione (lettura o modifica) diventano accessibili ad altre transazioni solo dopo il completamento della prima transazione.<\/p>\n<p>Iniziamo a capire se c'\u00e8 un 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 cosa fa l'altro che ha aperto la transazione.<\/p>\n<p>Vediamo se le transazioni di flussi diversi vedono ci\u00f2 che accade al loro interno. <\/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'uno dell'altro. 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, era prevedibile per i globali, per i quali la velocit\u00e0 \u00e8 sempre stata 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>\u00c8 importante riflettere su perch\u00e9 siano necessari i livelli di isolamento e 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 ottenere questo tramite blocchi adeguati in ObjectScript, che offrono molteplici modi di applicazione: \u00e8 possibile eseguire blocchi normali, incrementali o multipli 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>I livelli di isolamento inferiori rappresentano compromessi finalizzati a incrementare la velocit\u00e0 del database.<\/p>\n<p>Vediamo come possiamo ottenere diversi livelli di isolamento tramite i blocchi.<\/p>\n<p>Questo operatore consente di utilizzare non solo i blocchi esclusivi necessari per modificare i dati, ma anche i blocchi condivisi, che possono essere acquisiti in parallelo da pi\u00f9 thread quando \u00e8 necessario leggere dati che non devono essere modificati da altri processi durante la lettura.<\/p>\n<p>Maggiore informazione 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 consiste nel fatto che durante la transazione lo stato del database pu\u00f2 risultare incoerente, tuttavia questi dati incoerenti sono visibili ad altri processi. Come evitarlo?<\/p>\n<p>Lo faremo attraverso i blocchi creando finestre di visibilit\u00e0 in cui lo stato del database sar\u00e0 coerente. E tutti gli accessi a tali finestre di visibilit\u00e0 allo stato coerente saranno controllati dai blocchi.<\/p>\n<p>I blocchi condivisi degli stessi dati sono riutilizzabili: possono essere acquisiti da pi\u00f9 processi. Questi blocchi impediscono 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 sono utilizzati per le modifiche ai dati \u2014 solo un processo pu\u00f2 acquisire tale blocco. Un blocco esclusivo pu\u00f2 essere acquisito da:<\/p>\n<ol>\n<li>Qualsiasi processo, se i dati sono liberi<\/li>\n<li>Solo il processo che ha un blocco shared sui dati e ha richiesto per primo il blocco esclusivo.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transazioni nei globali di InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPi\u00f9 stretto \u00e8 il riquadro di visibilit\u00e0, pi\u00f9 a lungo devono aspettare gli altri processi, ma pi\u00f9 coerente pu\u00f2 essere lo stato del DB in esso.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 il punto di questo livello \u00e8 che vediamo solo i dati confermati dagli altri flussi. Se i dati in un'altra transazione non sono ancora confermati, vediamo la loro vecchia versione.<\/p>\n<p>Questo ci permette di parallelizzare il lavoro invece di aspettare che il blocco venga rilasciato.<\/p>\n<p>Senza trucchi speciali non saremo in grado di vedere la vecchia versione dei dati in IRIS, quindi dovremo accontentarci dei blocchi.<\/p>\n<p>Di conseguenza, dovremo utilizzare blocchi shared per autorizzare la lettura dei dati solo nei momenti di coerenza.<\/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 dalla persona 123 alla persona 242:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123), +^person(242)\nImposta ^person(123, amount) = ^person(123, amount) - amount\nImposta ^person(242, amount) = ^person(242, amount) + amount\nLOCK -^person(123), -^person(242)<\/code><\/pre>\n<p>\nIl momento della richiesta dell'importo di denaro per la persona 123 prima del prelievo deve essere accompagnato da un blocco esclusivo (di default):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nScrivi ^person(123)<\/code><\/pre>\n<p>\nE se \u00e8 necessario mostrare lo stato del conto nel pannello personale, si pu\u00f2 utilizzare un blocco condiviso o addirittura non utilizzarlo affatto:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\"S\"\nScrivi ^person(123)<\/code><\/pre>\n<p>\nTuttavia, se si suppone che le operazioni di accesso al database vengano eseguite praticamente istantaneamente (ricordo che i globali sono una struttura molto pi\u00f9 a basso livello rispetto a una tabella relazionale), allora la necessit\u00e0 di questo livello diminuisce.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 in questo livello di isolamento \u00e8 consentito che possano esserci pi\u00f9 letture dei dati che possono essere modificate da transazioni parallele. <\/p>\n<p>Di conseguenza, dovremo applicare un blocco condiviso per leggere i dati che modifichiamo e blocchi esclusivi sui dati che stiamo cambiando.<\/p>\n<p>Fortunatamente, l'operatore LOCK consente di elencare in dettaglio tutte le blocchi necessari in un'unica istruzione, che possono essere molto numerosi.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\"S\"\nlettura ^person(123, amount)<\/code><\/pre>\n<p>\naltre operazioni (in questo momento flussi paralleli cercano 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 i lucchetti separandoli con una virgola, vengono presi 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 presi tutti insieme in modo atomico.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 dovremo impostare i lucchetti in modo che, alla fine, tutte le transazioni che condividono dati vengano eseguite in sequenza. Per questo approccio, la maggior parte dei lucchetti deve essere esclusiva e presa sulle zone pi\u00f9 piccole del globale per le prestazioni.<\/p>\n<p>Se parliamo di prelievi di fondi nel globale ^person, per esso \u00e8 accettabile solo il livello di isolamento SERIALIZE, poich\u00e9 i soldi devono essere spesi rigorosamente in sequenza, altrimenti \u00e8 possibile spendere la stessa somma pi\u00f9 volte.<\/p>\n<h2>4. Persistenza<\/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 il trasferimento. Non sono stati riscontrati problemi.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nPer i globali in InterSystems IRIS, \u00e8 presente il supporto per le transazioni. Sono realmente atomiche e affidabili. Tuttavia, per garantire la coerenza del database nei globali, \u00e8 necessaria l'attivit\u00e0 del programmatore e l'uso di transazioni, poich\u00e9 non ci sono complesse strutture incorporate come le chiavi esterne.<\/p>\n<p>Il livello di isolamento nei globali senza l'uso di blocchi \u00e8 READ UNCOMMITTED, mentre con l'uso di blocchi pu\u00f2 essere garantito fino al livello SERIALIZE.<\/p>\n<p>La correttezza e la velocit\u00e0 di esecuzione delle transazioni nei globali dipendono fortemente dalla competenza del programmatore: pi\u00f9 ampiamente vengono utilizzati i blocchi shared in lettura, pi\u00f9 alto \u00e8 il livello di isolamento, mentre pi\u00f9 ristretti sono i blocchi esclusivi, maggiore \u00e8 la velocit\u00e0 di esecuzione.<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.0.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 \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\" \/>\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.0.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 \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\" \/>\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 di InterSystems IRIS | ProHoster","description":"Il DBMS InterSystems IRIS supporta strutture interessanti per la memorizzazione dei dati: i globali. Fondamentalmente, si tratta di chiavi multilivello con diverse funzionalit\u00e0 aggiuntive come le transazioni, funzioni rapide per l'attraversamento degli alberi di dati, locking e il proprio linguaggio ObjectScript. Maggiori informazioni sui globali nella serie di articoli \"Globali: spade magiche per la memorizzazione dei dati\": Alberi. Parte 1 Alberi. Parte 2 Array sparsi. Parte","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 \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","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}]}}