{"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\/es\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transacciones en las globales de InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transacciones en las globales de InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>La base de datos InterSystems IRIS admite estructuras curiosas para el almacenamiento de datos: las globales. En esencia, son claves multinivel con diversas ventajas adicionales como transacciones, funciones r\u00e1pidas para navegar por \u00e1rboles de datos, bloqueos y su propio lenguaje ObjectScript.<\/p>\n<p>M\u00e1s sobre las globales en la serie de art\u00edculos \u00abLas globales: espadas en el almacenamiento de datos\u00bb:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">\u00c1rboles. Parte 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">\u00c1rboles. Parte 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Matrices dispersas. Parte 3<\/a><\/noindex><\/p>\n<p>Me intrig\u00f3 c\u00f3mo se implementan las transacciones en las globales y qu\u00e9 caracter\u00edsticas tienen. Dado que se trata de una estructura de almacenamiento de datos completamente diferente de las tablas que todos conocemos, es mucho m\u00e1s de bajo nivel.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nComo se sabe en la teor\u00eda de bases de datos relacionales, una buena implementaci\u00f3n de transacciones debe cumplir con los requisitos <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 At\u00f3mico.<\/b> Se registran todos los cambios realizados en la transacci\u00f3n o ning\u00fan cambio en absoluto.<\/p>\n<p><b>C \u2014 Consistencia.<\/b> Despu\u00e9s de completar la transacci\u00f3n, el estado l\u00f3gico de la base de datos debe ser internamente coherente. En gran medida, este requisito corresponde al programador, pero en el caso de bases de datos SQL, tambi\u00e9n se refiere a las claves externas.<\/p>\n<p><b>I \u2014 Aislado.<\/b> Las transacciones que se ejecutan en paralelo no deben influirse entre s\u00ed.<\/p>\n<p><b>D \u2014 Durable.<\/b> Despu\u00e9s de que una transacci\u00f3n se complete con \u00e9xito, los problemas en niveles inferiores (como un corte de energ\u00eda, por ejemplo) no deben afectar los datos modificados por la transacci\u00f3n.<\/p>\n<p>Las globales son estructuras de datos no relacionales. Fueron creadas para un funcionamiento extremadamente r\u00e1pido en hardware muy limitado. Vamos a analizar la implementaci\u00f3n de transacciones en las globales usando <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">la imagen oficial de docker de IRIS<\/a><\/noindex>.<\/p>\n<p>Para soportar transacciones en IRIS, se utilizan los comandos: <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. Atomicidad<\/h2>\n<p>\nEs m\u00e1s f\u00e1cil verificar la atomicidad. Comprobamos desde la consola de la base de datos.<\/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>\nLuego hacemos la salida:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nObtenemos:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nTodo en orden. Se cumple la atomicidad: todos los cambios se registraron.<\/p>\n<p>Complicaremos la tarea, introduciremos un error y veremos c\u00f3mo se guarda la transacci\u00f3n, parcialmente o no se guarda en absoluto.<\/p>\n<p>Verificamos de nuevo la atomicidad:<\/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>\nDespu\u00e9s de lo cual forzaremos el contenedor a detenerse, lo iniciaremos y observaremos. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nEste comando es pr\u00e1cticamente equivalente a un apagado forzado, ya que env\u00eda la se\u00f1al de parada inmediata del proceso SIGKILL.<\/p>\n<p>\u00bfPodr\u00eda ser que la transacci\u00f3n se haya guardado parcialmente?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 No, no se guard\u00f3.<\/p>\n<p>Probemos el comando de reversi\u00f3n:<\/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>\nTampoco se guard\u00f3 nada.<\/p>\n<h2>2. Consistencia<\/h2>\n<p>\nDado que en las bases de datos, los \u00edndices se realizan tambi\u00e9n sobre los globales (recordemos que un global es una estructura de almacenamiento de datos de bajo nivel, m\u00e1s que una tabla relacional), para cumplir con el requisito de consistencia, es necesario incluir el cambio de clave en la misma transacci\u00f3n que el cambio del global.<\/p>\n<p>Por ejemplo, tenemos el global ^person, donde almacenamos identidades, y usamos el NIF como clave.<\/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>\nPara tener una b\u00fasqueda r\u00e1pida por apellido y nombre, creamos el \u00edndice ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nPara que la base sea consistente, debemos agregar la identidad de esta manera:<\/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>\nPor lo tanto, al eliminar tambi\u00e9n debemos usar una transacci\u00f3n:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nEn otras palabras, el cumplimiento del requisito de consistencia recae completamente en el programador. Pero cuando se trata de globales, esto es normal, debido a su naturaleza de bajo nivel.<\/p>\n<h2>3. Aislamiento<\/h2>\n<p>\nAqu\u00ed es donde comienzan los problemas. Muchos usuarios trabajan simult\u00e1neamente en la misma base, modificando los mismos datos.<\/p>\n<p>La situaci\u00f3n es comparable a cuando muchos usuarios trabajan al mismo tiempo con el mismo repositorio de c\u00f3digo y tratan de enviar cambios a muchos archivos al mismo tiempo.<\/p>\n<p>La base de datos debe gestionar todo esto en tiempo real. Dado que en empresas serias incluso hay una persona dedicada a controlar las versiones (a fusionar ramas, resolver conflictos, etc.), y la base de datos debe hacerlo todo en tiempo real, se hace evidente la complejidad de la tarea y la necesidad de un dise\u00f1o correcto de la base de datos y del c\u00f3digo que la mantenga.<\/p>\n<p>Una base de datos no puede entender el significado de las acciones realizadas por los usuarios para evitar conflictos cuando trabajan con los mismos datos. Solo puede deshacer una transacci\u00f3n que contradice a otra o ejecutarlas de manera secuencial.<\/p>\n<p>Otro problema es que durante la ejecuci\u00f3n de una transacci\u00f3n (antes del commit), el estado de la base de datos puede ser inconsistente. Por lo tanto, es deseable que otras transacciones no tengan acceso a este estado inconsistente, lo que se logra en bases de datos relacionales de diversas maneras: creando instant\u00e1neas, mediante la multiversion de filas, etc.<\/p>\n<p>Cuando se ejecutan transacciones en paralelo, es importante que no interfieran entre s\u00ed. Esta es la propiedad de aislamiento.<\/p>\n<p>SQL define 4 niveles de aislamiento:<\/p>\n<ul>\n<li>LECTURA NO COMPROMETIDA<\/li>\n<li>LECTURA COMPROMETIDA<\/li>\n<li>LECTURA REPETIBLE<\/li>\n<li>SERIALIZABLE<\/li>\n<\/ul>\n<p>\nExaminemos cada nivel por separado. Los costos de implementaci\u00f3n de cada nivel aumentan casi exponencialmente.<\/p>\n<p><b>LECTURA NO COMPROMETIDA<\/b> \u2014 es el nivel m\u00e1s bajo de aislamiento, pero tambi\u00e9n el m\u00e1s r\u00e1pido. Las transacciones pueden leer los cambios realizados entre ellas.<\/p>\n<p><b>LECTURA COMPROMETIDA<\/b> \u2014 este es el siguiente nivel de aislamiento, que representa un compromiso. Las transacciones no pueden leer los cambios realizados entre ellas hasta que se comprometan, pero pueden leer cualquier cambio realizado despu\u00e9s del commit.<\/p>\n<p>Si tenemos una larga transacci\u00f3n T1, durante la cual se han realizado commits en las transacciones T2, T3 \u2026 Tn, que trabajaron con los mismos datos que T1, al consultar datos en T1 recibiremos resultados diferentes cada vez. Este fen\u00f3meno se llama lectura no repetible.<\/p>\n<p><b>LECTURA REPETIBLE<\/b> \u2014 en este nivel de aislamiento no tenemos el fen\u00f3meno de lectura no repetible, ya que para cada solicitud de lectura de datos se crea una instant\u00e1nea del resultado de los datos y cuando se reutilizan en la misma transacci\u00f3n se usan los datos de la instant\u00e1nea. Sin embargo, en este nivel de aislamiento es posible leer datos fantasma, refiri\u00e9ndose a la lectura de nuevas filas que fueron a\u00f1adidas por transacciones paralelas confirmadas.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 el nivel m\u00e1s alto de aislamiento. Se caracteriza por el hecho de que los datos utilizados de alguna manera en la transacci\u00f3n (lectura o modificaci\u00f3n) solo se vuelven accesibles a otras transacciones despu\u00e9s de completar la primera transacci\u00f3n.<\/p>\n<p>Primero, aclaremos si hay aislamiento entre las operaciones en la transacci\u00f3n y el flujo principal. Abriremos 2 terminales.<\/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>\nNo hay aislamiento. Un hilo ve lo que hace el segundo que abri\u00f3 la transacci\u00f3n.<\/p>\n<p>Veamos si las transacciones de diferentes hilos ven lo que sucede dentro de ellas. <\/p>\n<p>Abriremos 2 terminales y ejecutaremos 2 transacciones en paralelo.<\/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>\nLas transacciones paralelas ven los datos entre s\u00ed. As\u00ed que hemos obtenido el nivel m\u00e1s simple pero tambi\u00e9n el m\u00e1s r\u00e1pido de aislamiento, READ UNCOMMITTED.<\/p>\n<p>En principio, se podr\u00eda esperar esto para los globales, donde el rendimiento siempre ha sido la prioridad. <\/p>\n<p>\u00bfQu\u00e9 hacer si necesitamos un nivel de aislamiento m\u00e1s alto en operaciones sobre globales?<\/p>\n<p>Es necesario pensar por qu\u00e9 son necesarios los niveles de aislamiento y c\u00f3mo funcionan.<\/p>\n<p>El nivel m\u00e1s alto de aislamiento, SERIALIZE, significa que el resultado de las transacciones ejecutadas en paralelo es equivalente a su ejecuci\u00f3n secuencial, lo que garantiza la ausencia de colisiones.<\/p>\n<p>Podemos lograr esto mediante bloqueos adecuados en ObjectScript, que tienen una gran variedad de formas de aplicaci\u00f3n: se pueden hacer bloqueos ordinarios, incrementales y m\u00faltiples usando el 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>Los niveles de aislamiento m\u00e1s bajos son compromisos destinados a aumentar la velocidad de la base de datos.<\/p>\n<p>Veamos c\u00f3mo podemos obtener diferentes niveles de aislamiento mediante bloqueos.<\/p>\n<p>Este operador permite no solo tomar bloqueos exclusivos, necesarios para modificar los datos, sino tambi\u00e9n bloqueos compartidos que pueden ser utilizados en paralelo por varios hilos, cuando necesitan leer datos que no deben ser modificados por otros procesos durante la lectura.<\/p>\n<p>M\u00e1s sobre el m\u00e9todo de bloqueo en dos fases en ruso e ingl\u00e9s:<\/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\">Bloqueo en dos fases<\/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 dificultad radica en que, durante la transacci\u00f3n, el estado de la base puede estar desalineado; sin embargo, estos datos desalineados son visibles para otros procesos. \u00bfC\u00f3mo evitar esto?<\/p>\n<p>Lo lograremos a trav\u00e9s de bloqueos para crear ventanas de visibilidad en las que el estado de la base estar\u00e1 alineado. Todas las solicitudes a estas ventanas de visibilidad de estado alineado estar\u00e1n controladas por bloqueos.<\/p>\n<p>Los bloqueos compartidos de los mismos datos son reutilizables: varios procesos pueden obtenerlos. Estos bloqueos impiden que otros procesos modifiquen los datos, es decir, se utilizan para crear ventanas de un estado coherente de la base de datos.<\/p>\n<p>Los bloqueos exclusivos se utilizan para modificar datos; solo un proceso puede adquirir tal bloqueo. Un bloqueo exclusivo puede ser adquirido por:<\/p>\n<ol>\n<li>Cualquier proceso si los datos est\u00e1n libres.<\/li>\n<li>Solo aquel proceso que tiene un bloqueo compartido sobre esos datos y fue el primero en solicitar el bloqueo exclusivo.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transacciones en las globales de InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCuanto m\u00e1s estrecha sea la ventana de visibilidad, m\u00e1s tiempo tendr\u00e1n que esperar otros procesos, pero m\u00e1s coherente puede ser el estado de la base de datos en ella.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 la esencia de este nivel es que solo vemos los datos confirmados de otros hilos. Si los datos en otra transacci\u00f3n a\u00fan no est\u00e1n confirmados, vemos su versi\u00f3n anterior.<\/p>\n<p>Esto nos permite paralelizar el trabajo en lugar de esperar a que se liberen los bloqueos.<\/p>\n<p>Sin trucos especiales, no podremos ver la versi\u00f3n anterior de los datos en IRIS, por lo que tendremos que manejar los bloqueos.<\/p>\n<p>Por lo tanto, deberemos usar bloqueos compartidos para permitir la lectura de datos solo en momentos de coherencia.<\/p>\n<p>Supongamos que tenemos una base de datos de usuarios ^person, que se transfieren dinero entre s\u00ed.<\/p>\n<p>El momento de transferencia de la persona 123 a la 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>\nEl momento de consultar la cantidad de dinero de la persona 123 antes de realizar la deducci\u00f3n debe acompa\u00f1arse de un bloqueo exclusivo (por defecto):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nPero si necesitamos mostrar el estado de la cuenta en el panel personal, se puede utilizar un bloqueo compartido o incluso no usar ning\u00fan bloqueo:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nSin embargo, si asumimos que las operaciones en la base de datos se realizan pr\u00e1cticamente al instante (recuerde que las estructuras globales son mucho m\u00e1s de bajo nivel que una tabla relacional), la necesidad de este nivel disminuye.<\/p>\n<p><b>LECTURA REPETIBLE<\/b> \u2014 en este nivel de aislamiento se permite que haya m\u00faltiples lecturas de datos que pueden ser modificados por transacciones paralelas. <\/p>\n<p>Por lo tanto, deberemos establecer un bloqueo compartido para la lectura de los datos que modificamos y bloqueos exclusivos para los datos que cambiamos.<\/p>\n<p>La ventaja del operador LOCK permite enumerar en detalle todas las bloqueos necesarios dentro de un solo operador, los cuales pueden ser numerosos.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nlectura de ^person(123, amount)<\/code><\/pre>\n<p>\notras operaciones (mientras tanto, flujos paralelos intentan modificar ^person(123, amount), pero no pueden)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nmodificaci\u00f3n de ^person(123, amount)\nLOCK -^person(123, amount)\n\nlectura de ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nAl enumerar los bloqueos usando comas, se obtienen secuencialmente, pero si se hace as\u00ed:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\nse obtienen at\u00f3micamente de una vez.<\/p>\n<p><b>SERIALIZE<\/b> debemos establecer los bloqueos de tal manera que, en \u00faltima instancia, todas las transacciones que tienen datos comunes se ejecuten secuencialmente. Para este enfoque, la mayor\u00eda de los bloqueos deben ser exclusivos y abarcar las \u00e1reas m\u00e1s peque\u00f1as del global para mejorar el rendimiento.<\/p>\n<p>Si hablamos de retiros de fondos en el global ^person, solo se acepta el nivel de aislamiento SERIALIZE, ya que el dinero debe gastarse estrictamente en un orden secuencial, de lo contrario es posible gastar la misma cantidad varias veces.<\/p>\n<h2>4. Durabilidad<\/h2>\n<p>\nRealic\u00e9 pruebas con el apagado abrupto del contenedor mediante<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nLa base lo manej\u00f3 bien. No se identificaron problemas.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\nPara los globals en InterSystems IRIS hay soporte para transacciones. Son realmente at\u00f3micas y confiables. Sin embargo, para garantizar la coherencia de la base de datos en los globals, se requiere el esfuerzo del programador y el uso de transacciones, ya que no hay complejas construcciones integradas como claves externas.<\/p>\n<p>El nivel de aislamiento en los globals sin usar bloqueos es READ UNCOMMITTED, y al usar bloqueos se puede garantizar hasta el nivel SERIALIZE.<\/p>\n<p>La correcci\u00f3n y velocidad del trabajo de las transacciones en los globals depende en gran medida de la habilidad del programador: cuanto m\u00e1s se utilicen bloqueos compartidos para la lectura, m\u00e1s alto ser\u00e1 el nivel de aislamiento, y cuanto m\u00e1s se restrinjan los bloqueos exclusivos, mayor ser\u00e1 el rendimiento.<br \/>\n<br \/>Fuente: <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 - 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\/es\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Transacciones en los globals de InterSystems IRIS | ProHoster","description":"La base de datos InterSystems IRIS soporta estructuras interesantes.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}