{"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\/de\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transaktionen in den Globals von InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transaktionen in den Globals von InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Die Datenbank InterSystems IRIS unterst\u00fctzt ausgekl\u00fcgelte Strukturen zur Speicherung von Daten \u2013 Globals. Im Wesentlichen handelt es sich um mehrstufige Schl\u00fcssel mit verschiedenen zus\u00e4tzlichen Funktionen wie Transaktionen, schnellen Funktionen zur Durchquerung von Datenb\u00e4umen, Sperren und einer eigenen Sprache, ObjectScript.<\/p>\n<p>Mehr \u00fcber Globals in der Artikelreihe \u201eGlobals \u2013 die Sch\u00e4tze zur Datenspeicherung\u201c:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">B\u00e4ume. Teil 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">B\u00e4ume. Teil 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">Sparsame Arrays. Teil 3<\/a><\/noindex><\/p>\n<p>Mich interessiert, wie Transaktionen in Globals implementiert sind und welche Besonderheiten es gibt. Schlie\u00dflich handelt es sich um eine ganz andere Struktur zur Datenspeicherung als die allt\u00e4glichen Tabellen. Sie ist viel niedrigerebene.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nWie bekannt, muss eine gute Implementierung von Transaktionen gem\u00e4\u00df der Theorie relationaler Datenbanken den Anforderungen gerecht werden. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2013 Atomarit\u00e4t.<\/b> Alle in der Transaktion vorgenommenen \u00c4nderungen werden entweder festgeschrieben oder es werden gar keine vorgenommen.<\/p>\n<p><b>C \u2013 Konsistenz.<\/b> Nach Abschluss der Transaktion muss der logische Zustand der Datenbank intern konsistent sein. Vieles in dieser Anforderung betrifft den Programmierer, betrifft aber bei SQL-Datenbanken auch die Fremdschl\u00fcssel.<\/p>\n<p><b>I \u2013 Isolierung.<\/b> Parallel ausgef\u00fchrte Transaktionen d\u00fcrfen sich nicht gegenseitig beeinflussen.<\/p>\n<p><b>D \u2013 Dauerhaftigkeit.<\/b> Nach erfolgreichem Abschluss der Transaktion d\u00fcrfen Probleme auf unteren Ebenen (z. B. Stromausfall) die von der Transaktion ge\u00e4nderten Daten nicht beeintr\u00e4chtigen.<\/p>\n<p>Globals sind nicht-relationale Datenstrukturen. Sie wurden f\u00fcr extrem schnelle Arbeiten auf sehr begrenzter Hardware entwickelt. Lassen Sie uns die Implementierung von Transaktionen in Globals anhand von <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">dem offiziellen Docker-Image von IRIS<\/a><\/noindex>.<\/p>\n<p>Zur Unterst\u00fctzung von Transaktionen in IRIS werden folgende Befehle verwendet: <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\u00e4t<\/h2>\n<p>\nDie Atomarit\u00e4t l\u00e4sst sich am einfachsten \u00fcberpr\u00fcfen. Wir pr\u00fcfen aus der Datenbankkonsole.<\/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>\nDanach machen wir eine Ausgabe:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\nWir erhalten:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\nAlles in Ordnung. Die Atomarit\u00e4t ist gew\u00e4hrleistet: Alle \u00c4nderungen wurden gespeichert.<\/p>\n<p>Lassen Sie uns die Aufgabe komplizieren, indem wir einen Fehler einf\u00fchren und sehen, wie die Transaktion gespeichert wird, teilweise oder gar nicht.<\/p>\n<p>\u00dcberpr\u00fcfen wir noch einmal die Atomarit\u00e4t:<\/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>\nDanach werden wir den Container gewaltsam anhalten, neu starten und schauen. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDieser Befehl ist praktisch gleichbedeutend mit einem gewaltsamen Ausschalten der Stromversorgung, da er das Signal SIGKILL zum sofortigen Stoppen des Prozesses sendet.<\/p>\n<p>K\u00f6nnte die Transaktion teilweise gespeichert worden sein?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Nein, es wurde nichts gespeichert.<\/p>\n<p>Wir testen den Rollback-Befehl:<\/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>\nEs wurde ebenfalls nichts gespeichert.<\/p>\n<h2>2. Konsistenz<\/h2>\n<p>\nDa in Datenbanken die Schl\u00fcssel auch auf globalen Ebenen erstellt werden (ich erinnere daran, dass ein Globaler eine niedrigere Struktur zur Datenspeicherung ist als eine relationale Tabelle), muss die \u00c4nderung des Schl\u00fcssels in derselben Transaktion enthalten sein wie die \u00c4nderung des Globals, um die Konsistenz zu gew\u00e4hrleisten.<\/p>\n<p>Angenommen, wir haben einen Globalen ^person, in dem wir Pers\u00f6nlichkeiten speichern und als Schl\u00fcssel die Steueridentifikationsnummer (INN) verwenden.<\/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>\nUm eine schnelle Suche nach Nachnamen und Vornamen zu erm\u00f6glichen, haben wir den Schl\u00fcssel ^index erstellt.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nDamit die Datenbank konsistent bleibt, m\u00fcssen wir die Pers\u00f6nlichkeit so hinzuf\u00fcgen:<\/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>\nDementsprechend m\u00fcssen wir auch beim L\u00f6schen eine Transaktion verwenden:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nMit anderen Worten liegt die Erf\u00fcllung der Konsistenzanforderungen vollst\u00e4ndig in der Verantwortung des Programmierers. Aber wenn es um Globale geht, ist das aufgrund ihrer niedrigeren Natur normal.<\/p>\n<h2>3. Isolation<\/h2>\n<p>\nHier fangen die Schwierigkeiten an. Viele Benutzer arbeiten gleichzeitig an derselben Datenbank und \u00e4ndern dieselben Daten.<\/p>\n<p>Die Situation ist vergleichbar damit, wenn viele Benutzer gleichzeitig an demselben Code-Repository arbeiten und versuchen, gleichzeitig \u00c4nderungen an vielen Dateien zu committen.<\/p>\n<p>Die Datenbank muss all dies in Echtzeit bew\u00e4ltigen. Angesichts dessen, dass es in gro\u00dfen Unternehmen sogar spezielle Personen gibt, die f\u00fcr die Versionskontrolle (f\u00fcr das Zusammenf\u00fchren von Branches, das L\u00f6sen von Konflikten usw.) verantwortlich sind, und die DB all dies in Echtzeit erledigen muss, wird die Komplexit\u00e4t der Aufgabe und die Richtigkeit des Designs der Datenbank sowie des dazugeh\u00f6rigen Codes offensichtlich.<\/p>\n<p>Die Datenbank kann die Bedeutung der von den Benutzern ausgef\u00fchrten Aktionen nicht verstehen, um Konflikte zu vermeiden, wenn sie an denselben Daten arbeiten. Sie kann nur eine transaktionale Handlung stornieren, die einer anderen widerspricht, oder sie nacheinander ausf\u00fchren.<\/p>\n<p>Ein weiteres Problem ist, dass w\u00e4hrend der Ausf\u00fchrung einer Transaktion (vor dem Commit) der Zustand der Datenbank inkonsistent sein kann, weshalb es w\u00fcnschenswert ist, dass andere Transaktionen keinen Zugriff auf den inkonsistenten Zustand der Datenbank haben. Das wird in relationalen Datenbanken auf vielf\u00e4ltige Weise erreicht: durch das Erstellen von Snapshots, Mehrversionsverwaltung von Zeilen usw.<\/p>\n<p>Bei der parallelen Ausf\u00fchrung von Transaktionen ist es wichtig, dass sie sich nicht gegenseitig st\u00f6ren. Das ist das Eigenschaft der Isolation.<\/p>\n<p>SQL definiert vier Isolationsebenen:<\/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>\nBetrachten wir jede Ebene einzeln. Die Kosten f\u00fcr die Umsetzung jeder Ebene steigen nahezu exponentiell.<\/p>\n<p><b>READ UNCOMMITTED<\/b> \u2014 das ist die niedrigste Isolationsebene, aber gleichzeitig die schnellste. Transaktionen k\u00f6nnen \u00c4nderungen lesen, die von anderen vorgenommen wurden.<\/p>\n<p><b>READ COMMITTED<\/b> \u2014 das ist die n\u00e4chste Isolationsebene, die einen Kompromiss darstellt. Transaktionen k\u00f6nnen \u00c4nderungen, die von anderen vorgenommen wurden, bis zum Commit nicht lesen, aber sie k\u00f6nnen alle \u00c4nderungen lesen, die nach dem Commit vorgenommen wurden.<\/p>\n<p>Wenn wir eine lange Transaktion T1 haben, w\u00e4hrend der in den Transaktionen T2, T3 \u2026 Tn Commits erfolgt sind, die mit denselben Daten arbeiten, die auch T1 verwendet, dann erhalten wir bei der Abfrage von Daten in T1 jedes Mal unterschiedliche Ergebnisse. Dieses Ph\u00e4nomen wird nicht wiederholbares Lesen genannt.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 in dieser Isolationsebene haben wir das Ph\u00e4nomen des nicht wiederholbaren Lesens nicht, da f\u00fcr jede Datenleseanfrage ein Snapshot der Ergebnisdaten erstellt wird, und bei einer Wiederverwendung in derselben Transaktion werden die Daten aus dem Snapshot verwendet. In dieser Isolationsebene ist jedoch das Lesen von Phantomdaten m\u00f6glich. Dabei handelt es sich um das Lesen neuer Zeilen, die von parallelen, festgeschriebenen Transaktionen hinzugef\u00fcgt wurden.<\/p>\n<p><b>SERIALIZABLE<\/b> \u2014 die h\u00f6chste Isolationsebene. Sie ist dadurch charakterisiert, dass Daten, die in einer Transaktion auf irgendeine Weise verwendet werden (lesen oder \u00e4ndern), f\u00fcr andere Transaktionen erst nach Abschluss der ersten Transaktion verf\u00fcgbar sind.<\/p>\n<p>Zun\u00e4chst kl\u00e4ren wir, ob die Isolierung der Vorg\u00e4nge in der Transaktion vom Hauptstrom vorhanden ist. Wir \u00f6ffnen 2 Terminalfenster.<\/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>\nEs gibt keine Isolierung. Ein Thread sieht, was der andere, der die Transaktion er\u00f6ffnet hat, tut.<\/p>\n<p>Schauen wir uns an, ob die Transaktionen verschiedener Threads das sehen, was in ihnen passiert. <\/p>\n<p>Wir \u00f6ffnen 2 Terminalfenster und f\u00fchren 2 Transaktionen parallel aus.<\/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>\nParallele Transaktionen sehen die Daten einander. Damit haben wir die einfachste, aber auch schnellste Isolationsstufe READ UNCOMMITTED erreicht.<\/p>\n<p>Im Grunde konnte man das bei Globals erwarten, f\u00fcr die Geschwindigkeit immer an erster Stelle stand. <\/p>\n<p>Was tun, wenn wir eine h\u00f6here Isolationsstufe bei Vorg\u00e4ngen mit Globals ben\u00f6tigen?<\/p>\n<p>Hier sollte man sich fragen, warum Isolationsstufen \u00fcberhaupt ben\u00f6tigt werden und wie sie funktionieren.<\/p>\n<p>Die h\u00f6chste Isolationsstufe SERIALIZE bedeutet, dass das Ergebnis parallel ausgef\u00fchrter Transaktionen dem ihrer sequentiellen Ausf\u00fchrung entspricht, was eine Kollision ausschlie\u00dft.<\/p>\n<p>Das k\u00f6nnen wir mit intelligenten Locks in ObjectScript erreichen, die viele Anwendungsm\u00f6glichkeiten bieten: man kann regul\u00e4re, inkrementelle, oder Mehrfachsperren mit dem Befehl <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>Niedrigere Isolationsstufen sind Kompromisse, die darauf abzielen, die Datenbankgeschwindigkeit zu erh\u00f6hen.<\/p>\n<p>Schauen wir uns an, wie wir verschiedene Isolationsstufen mit Sperren erreichen k\u00f6nnen.<\/p>\n<p>Dieser Befehl erlaubt es, nicht nur exklusive Sperren zu setzen, die f\u00fcr Daten\u00e4nderungen n\u00f6tig sind, sondern auch sogenannte shared, die von mehreren Threads parallel genutzt werden k\u00f6nnen, wenn sie Daten lesen m\u00fcssen, die von anderen Prozessen w\u00e4hrend des Lesens nicht ge\u00e4ndert werden d\u00fcrfen.<\/p>\n<p>Mehr \u00fcber das zweiphasige Sperrverfahren auf Russisch und Englisch:<\/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\">Zweiphasige Sperre<\/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>Das Problem liegt darin, dass der Zustand der Datenbank w\u00e4hrend einer Transaktion inkonsistent sein kann, diese inkonsistenten Daten jedoch anderen Prozessen sichtbar sind. Wie kann man das vermeiden?<\/p>\n<p>Wir werden mithilfe von Sperren Sichtfenster schaffen, in denen der Datenbankzustand konsistent sein wird. Alle Zugriffe auf solche Sichtfenster des konsistenten Zustandes werden durch Sperren kontrolliert.<\/p>\n<p>Shared-Sperren f\u00fcr dieselben Daten sind mehrfach \u2014 sie k\u00f6nnen von mehreren Prozessen \u00fcbernommen werden. Diese Sperren verhindern, dass andere Prozesse die Daten \u00e4ndern, d. h. sie werden zur Erstellung von Fenstern mit konsistentem Zustand der Datenbank verwendet.<\/p>\n<p>Exklusive Sperren werden f\u00fcr Daten\u00e4nderungen verwendet \u2014 eine solche Sperre kann nur von einem Prozess \u00fcbernommen werden. Eine exklusive Sperre kann \u00fcbernommen werden von:<\/p>\n<ol>\n<li>Jedem Prozess, sofern die Daten frei sind<\/li>\n<li>Nur dem Prozess, der eine shared-Sperre f\u00fcr die Daten hat und der als erster eine exklusive Sperre angefordert hat.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transaktionen in den Globals von InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJe enger das Sichtfenster, desto l\u00e4nger m\u00fcssen andere Prozesse warten, aber desto konsistenter kann der Zustand der Datenbank darin sein.<\/p>\n<p><b>READ_COMMITTED<\/b> \u2014 das Wesentliche dieses Levels ist, dass wir nur best\u00e4tigte Daten aus anderen Streams sehen. Wenn die Daten in einer anderen Transaktion noch nicht best\u00e4tigt sind, sehen wir ihre alte Version.<\/p>\n<p>Dies erm\u00f6glicht es uns, die Arbeit zu parallelisieren, anstatt auf die Freigabe der Sperre zu warten.<\/p>\n<p>Ohne spezielle Tricks k\u00f6nnen wir die alte Version der Daten in IRIS nicht sehen, daher m\u00fcssen wir mit Sperren auskommen.<\/p>\n<p>Demnach m\u00fcssen wir mithilfe von shared-Sperren das Lesen von Daten nur in Momenten der Konsistenz erlauben.<\/p>\n<p>Angenommen, wir haben eine Benutzerdatenbank ^person, in der sie sich gegenseitig Geld \u00fcberweisen.<\/p>\n<p>Der Moment der \u00dcberweisung von Person 123 zu Person 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>\nDer Moment der Anforderung des Geldbetrags von Person 123 vor der Belastung sollte von einer exklusiven Sperre begleitet werden (standardm\u00e4\u00dfig):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\nUnd wenn der Kontostand im pers\u00f6nlichen Bereich angezeigt werden muss, kann entweder eine shared-Sperre verwendet werden oder sie kann ganz entfallen:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nAngenommen, die Datenbankoperationen werden praktisch im Handumdrehen ausgef\u00fchrt (ich erinnere daran, dass Globals eine deutlich niedrigere Struktur sind als relationale Tabellen), dann ist die Notwendigkeit dieses Levels nicht gegeben.<\/p>\n<p><b>REPEATABLE READ<\/b> \u2014 in diesem Isolationslevel ist es erlaubt, dass es mehrere Lesevorg\u00e4nge gibt, die von parallelen Transaktionen ge\u00e4ndert werden k\u00f6nnen. <\/p>\n<p>Demnach m\u00fcssen wir eine shared-Sperre f\u00fcr die Daten, die wir \u00e4ndern, und exklusive Sperren f\u00fcr die Daten, die wir \u00e4ndern, setzen.<\/p>\n<p>Der Operator LOCK erm\u00f6glicht es, in einem einzigen Operator alle notwendigen Sperren detailliert aufzulisten, von denen es sehr viele geben kann.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201cS\u201d\nlesen ^person(123, amount)<\/code><\/pre>\n<p>\nandere Operationen (w\u00e4hrenddessen versuchen parallele Prozesse, ^person(123, amount) zu \u00e4ndern, k\u00f6nnen dies aber nicht)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\n\u00c4nderung ^person(123, amount)\nLOCK -^person(123, amount)\n\nlesen ^person(123, amount)\nLOCK -^person(123, amount)#\u201cS\u201d<\/code><\/pre>\n<p>\nBeim Auflisten von Sperren durch Kommas werden sie nacheinander behandelt, wenn man es so macht:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\nwerden sie alle atomar gleichzeitig erfasst.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 wir m\u00fcssen die Sperren so setzen, dass letztendlich alle Transaktionen, die gemeinsame Daten haben, nacheinander ausgef\u00fchrt werden. F\u00fcr diesen Ansatz m\u00fcssen die meisten Sperren exklusiv sein und auf die kleinsten Bereiche des Globals gesetzt werden, um die Leistung zu optimieren.<\/p>\n<p>Wenn es um Ausgaben aus dem Global ^person geht, ist nur das Isolationsniveau SERIALIZE akzeptabel, da Geld strikt nacheinander ausgegeben werden muss, andernfalls besteht die M\u00f6glichkeit, den gleichen Betrag mehrfach auszugeben.<\/p>\n<h2>4. Dauerhaftigkeit<\/h2>\n<p>\nIch habe Tests mit einem harten Ausschalten des Containers durchgef\u00fchrt durch<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nDie Datenbank hat dies gut \u00fcberstanden. Es wurden keine Probleme festgestellt.<\/p>\n<h2>Fazit<\/h2>\n<p>\nF\u00fcr Globals in InterSystems IRIS gibt es Unterst\u00fctzung f\u00fcr Transaktionen. Sie sind tats\u00e4chlich atomar und zuverl\u00e4ssig. Um die Konsistenz der Datenbank in Globals zu gew\u00e4hrleisten, sind die Anstrengungen des Programmierers und die Verwendung von Transaktionen erforderlich, da es keine komplexen eingebauten Strukturen wie Fremdschl\u00fcssel gibt.<\/p>\n<p>Das Isolationsniveau in Globals ohne Verwendung von Sperren ist READ UNCOMMITTED, und bei Verwendung von Sperren kann es bis hin zu SERIALIZE gew\u00e4hrleistet werden.<\/p>\n<p>Die Korrektheit und Geschwindigkeit von Transaktionen in Globals h\u00e4ngt stark von den F\u00e4higkeiten des Programmierers ab: Je breiter shared-Sperren beim Lesen verwendet werden, desto h\u00f6her ist das Isolationsniveau, und je schmaler exklusive Sperren gesetzt werden, desto schneller ist die Leistung.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Transaktionen in Globals InterSystems IRIS | ProHoster","description":"Die Datenbank InterSystems IRIS unterst\u00fctzt interessante Strukturen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}