{"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\/sl\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","title":{"rendered":"Transakcije u globalima InterSystems IRIS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Transakcije u globalima InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/ee4e58369616511dc213f94158b04e4f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Sistem \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0430\u0437\u0430\u043c\u0438 \u0414\u0430\u043d\u043d\u044b\u0445 InterSystems IRIS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\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 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \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\u043a\u0438 \u0438 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a ObjectScript.<\/p>\n<p>\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:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/263791\/\">\u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 1<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/264173\/\">\u0414\u0435\u0440\u0435\u0432\u044c\u044f. \u0427\u0430\u0441\u0442\u044c 2<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">\u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0427\u0430\u0441\u0442\u044c 3<\/a><\/noindex><\/p>\n<p>\u041c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445, \u043a\u0430\u043a\u0438\u0435 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0412\u0435\u0434\u044c \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0438\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0435\u043c \u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041e\u043d\u0430 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>:<\/p>\n<p><b>A \u2014 Atomic (\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c).<\/b> \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0438\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445.<\/p>\n<p><b>\u0421 \u2014 Consistency (\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c).<\/b> \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0411\u0414 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u043c. \u0412\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 SQL-\u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439.<\/p>\n<p><b>I \u2014 Isolate (\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c).<\/b> \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p><b>D \u2014 Durable (\u0434\u043e\u043b\u0433\u043e\u0432\u0435\u0447\u043d\u043e\u0441\u0442\u044c).<\/b> \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430 \u043d\u0438\u0436\u043d\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 (\u0441\u0431\u043e\u0439 \u043f\u043e \u043f\u0438\u0442\u0430\u043d\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044b \u2014 \u044d\u0442\u043e \u043d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u0441\u0432\u0435\u0440\u0445\u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/intersystems-iris-data-platform\/plans\/222f869e-567c-4928-b572-eb6a29706fbd?tab=instructions\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e docker-\u043e\u0431\u0440\u0430\u0437\u0430 IRIS<\/a><\/noindex>.<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0432 IRIS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b: <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. \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\n\u041b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/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>\n\u041f\u043e\u0442\u043e\u043c \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434:<\/p>\n<pre><code class=\"bash\">Write ^a(1), \u201c \u201d, ^a(2), \u201c \u201d, ^a(3)<\/code><\/pre>\n<p>\n\u041f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code class=\"bash\">1 2 3<\/code><\/pre>\n<p>\n\u0412\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0430: \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0423\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u0432\u0435\u0434\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a.<\/p>\n<p>\u0415\u0449\u0451 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c:<\/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>\n\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c. <\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nTa ekipa je prakti\u010dno ekvivalentna nasilnemu izklopu napajanja, saj po\u0161ilja signal za takoj\u0161njo zaustavitev procesa SIGKILL.<\/p>\n<p>Ali je mogo\u010de, da je transakcija delno shranjena?<\/p>\n<pre><code class=\"bash\">WRITE ^a(1), ^a(2), ^a(3)\n^\n ^a(1)<\/code><\/pre>\n<p>\n \u2014 Ne, ni shranjena.<\/p>\n<p>Preizkusimo ukaz za povrnitev:<\/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>\nTudi ni\u010d ni bilo shranjeno.<\/p>\n<h2>2. Konsistentnost<\/h2>\n<p>\nKer so klju\u010di v globalnih zbirkah oblikovani tudi na globalih (opomnim, da je global struktura z ni\u017ejo ravnijo za shranjevanje podatkov kot relacijska tabela), je za izpolnitev zahteve po konsistentnosti treba vklju\u010diti spremembo klju\u010da v isto transakcijo, kot tudi spremembo globala.<\/p>\n<p>Na primer, imamo global ^person, kjer shranjujemo osebne informacije in kot klju\u010d uporabljamo dav\u010dno \u0161tevilko.<\/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>\nDa bi imeli hiter iskalnik po priimkih in imenih, smo ustvarili klju\u010d ^index.<\/p>\n<pre><code class=\"bash\">^index('Kamenev', 'Sergey', 1234567) = 1<\/code><\/pre>\n<p>\nDa bi bila baza konsistentna, moramo dodati osebo tako:<\/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>\nUstrezno, pri brisanju moramo prav tako uporabiti transakcijo:<\/p>\n<pre><code class=\"bash\">TSTART\nKill ^person(1234567)\nZKill ^index('Kamenev', 'Sergey', 1234567)\nTCOMMIT<\/code><\/pre>\n<p>\nZ drugimi besedami, izpolnjevanje zahteve po konsistentnosti le\u017ei v celoti na ramenih programerja. A ko gre za globale \u2014 je to normalno, zaradi njihove nizke ravni narave.<\/p>\n<h2>3. Izolacija<\/h2>\n<p>\nTukaj se za\u010dnejo zapleti. Veliko uporabnikov hkrati dela na isti zbirki podatkov, spreminja iste podatke.<\/p>\n<p>Situacija je primerljiva s tem, ko veliko uporabnikov hkrati deluje z enim in istim repozitorijem kode in posku\u0161a hkrati napredovati s spremembami v ve\u010d datotekah naenkrat.<\/p>\n<p>Baza podatkov mora to vse razre\u0161evati v realnem \u010dasu. Glede na to, da imajo v resnih podjetjih celo posebne osebe, ki skrbijo za nadzor razli\u010dic (za zdru\u017eevanje vej, re\u0161evanje konfliktov itd.), in da mora vse to baza podatkov po\u010deti v realnem \u010dasu, postane o\u010ditna kompleksnost naloge in pravilnost na\u010drtovanja zbirke podatkov ter kode, ki jo vzdr\u017euje.<\/p>\n<p>Baza podatkov ne more razumeti pomena dejanj, ki jih izvajajo uporabniki, da bi prepre\u010dila konflikte, kadar delajo z istimi podatki. Lahko samo prekli\u010de eno transakcijo, ki nasprotuje drugi, ali pa ju izvede zaporedno.<\/p>\n<p>\u0160e en problem je, da je stanje baze med izvajanjem transakcije (pred potrditvijo) lahko neusklajeno, zato je najbolje, da druge transakcije nimajo dostopa do neusklajenega stanja baze podatkov. To se v relacijskih bazah dose\u017ee na ve\u010d na\u010dinov: s sistemom zajemanja trenutnih podatkov, ve\u010drazli\u010dnimi razli\u010dicami vrstic itd.<\/p>\n<p>Pri so\u010dasnem izvajanju transakcij je pomembno, da si ne morejo prepre\u010devati. To je lastnost izolacije.<\/p>\n<p>SQL dolo\u010da 4 ravni izolacije:<\/p>\n<ul>\n<li>NEPREBERENO<\/li>\n<li>PREBERENO POTRJENO<\/li>\n<li>PONOVLJENO PREBERENO<\/li>\n<li>SERIALIZABILNO<\/li>\n<\/ul>\n<p>\nPreglejmo vsako raven posebej. Stro\u0161ki izvajanja vsake ravni se nekoliko povi\u0161ujejo eksponentno.<\/p>\n<p><b>NEPREBERENO<\/b> \u2014 to je najni\u017eja raven izolacije, vendar je tudi najhitrej\u0161a. Transakcije lahko berejo spremembe, ki jih je naredil drug.<\/p>\n<p><b>PREBERENO POTRJENO<\/b> \u2014 to je naslednja raven izolacije, ki predstavlja kompromis. Transakcije ne morejo brati sprememb, ki jih je naredil drug, do potrditve, lahko pa berejo vse spremembe, ki so nastale po potrditvi.<\/p>\n<p>\u010ce imamo dolgo transakcijo T1, med katero so bile izvedene potrditve v transakcijah T2, T3 \u2026 Tn, ki so delovale s tistimi podatki, s katerimi je delovala T1, bomo ob zahtevi po podatkih v T1 vsaki\u010d dobili druga\u010den rezultat. Ta pojav se imenuje neponovljivo branje.<\/p>\n<p><b>PONOVLJENO PREBERENO<\/b> \u2014 pri tej ravni izolacije nimamo pojava neponovljivega branja, saj se za vsako zahtevo po branju podatkov ustvari zajem podatkov, in pri ponovnem uporabi v tej isti transakciji se uporabijo podatki iz zajema. Vendar pa pri tej ravni izolacije lahko pride do branja fantomskih podatkov. To pomeni branje novih vrstic, ki so jih dodale so\u010dasno potrjene transakcije.<\/p>\n<p><b>SERIALIZABILNO<\/b> \u2014 najvi\u0161ja raven izolacije. Zna\u010dilna je po tem, da so podatki, na kakr\u0161en koli na\u010din uporabljeni v transakciji (branje ali spreminjanje), drugim transakcijam dostopni \u0161ele po zaklju\u010dku prve transakcije.<\/p>\n<p>Najprej ugotovimo, ali obstaja izolacija operacij v transakciji od glavnega toka. Odprimo 2 terminalna okna.<\/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>\nIzolacija ne obstaja. En tok vidi, kaj drugi dela z odprto transakcijo.<\/p>\n<p>Poglejmo, ali razli\u010dni tori transakcij vidijo, kaj se dogaja v njih. <\/p>\n<p>Odprimo 2 terminalna okna in odprite 2 transakciji hkrati.<\/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>\nParalelne transakcije vidijo podatke druga druge. Tako smo dobili najpreprostej\u0161o, a tudi najhitrej\u0161o raven izolacije READ UNCOMMITTED.<\/p>\n<p>To je bilo v na\u010delu mogo\u010de pri\u010dakovati za globalne spremenljivke, za katere je bila vedno prioriteta hitrost. <\/p>\n<p>Kaj pa, \u010de potrebujemo vi\u0161jo raven izolacije pri operacijah z globalnimi spremenljivkami?<\/p>\n<p>Tukaj se moramo vpra\u0161ati, zakaj sploh potrebujemo ravni izolacije in kako delujejo.<\/p>\n<p>Najvi\u0161ja raven izolacije SERIALIZE pomeni, da je rezultat paralelno izvr\u0161enih transakcij enakovreden njihovemu zaporednemu izvr\u0161evanju, kar zagotavlja odsotnost kolizij.<\/p>\n<p>To lahko dose\u017eemo z ustreznimi zaklepanji v ObjectScript, ki ponujajo veliko razli\u010dnih na\u010dinov uporabe: lahko izvajamo obi\u010dajna, inkrementalna, ve\u010dkratna zaklepanja s pomo\u010djo ukaza <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>Nizke ravni izolacije so kompromisi, namenjeni pove\u010danju hitrosti delovanja baze podatkov.<\/p>\n<p>Poglejmo, kako lahko dose\u017eemo razli\u010dne ravni izolacije s pomo\u010djo zaklepanj.<\/p>\n<p>Ta ukaz omogo\u010da pridobivanje ne le ekskluzivnih zaklepanj, potrebnih za spremembo podatkov, temve\u010d tudi tako imenovanih deljenih zaklepanj, ki jih lahko hkrati pridobi ve\u010d tokov, ko morajo brati podatke, ki jih drugi procesi ne smejo spreminjati med branjem.<\/p>\n<p>Ve\u010d informacij o dvofazni metodi zaklepanja v ru\u0161\u010dini in angle\u0161\u010dini:<\/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\">Dvofazno zaklepanje<\/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>Te\u017eava je v tem, da je med transakcijo stanje baze lahko neusklajeno, vendar so ti neusklajeni podatki vidni drugim procesom. Kako se temu izogniti?<\/p>\n<p>Z zaklepanji bomo ustvarili taka okna vidnosti, v katerih bo stanje baze usklajeno. Vse zadeve do takih oken vidnosti usklajenega stanja bodo pod nadzorom zaklepanj.<\/p>\n<p>Deli\u010dna zaklepanja istih podatkov so ve\u010dkratna \u2014 lahko jih prevzamejo ve\u010d procesov. Ta zaklepanja drugim procesom prepovedujejo spremembo podatkov, torej se uporabljajo za oblikovanje okna usklajenega stanja Baze podatkov.<\/p>\n<p>Izklju\u010dna zaklepanja se uporabljajo za spremembe podatkov \u2014 to zaklepanje lahko prevzame samo en proces. Izklju\u010dna zaklepanja lahko prevzame:<\/p>\n<ol>\n<li>Katerikoli proces, \u010de so podatki prosti.<\/li>\n<li>Samo tisti proces, ki ima za te podatke deljeno zaklepanje in je prvi zaprosil za izklju\u010dno zaklepanje.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Transakcije u globalima InterSystems IRIS\" src=\"\/wp-content\/uploads\/2019\/07\/bb91ed1268925bc1b9266763ab82646a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTem bolje je okno vidnosti, tem dlje morajo drugi procesi \u010dakati, toda tem bolj usklajeno lahko je stanje Baze podatkov v njem.<\/p>\n<p><b>READ_COMMITED<\/b> \u2014 bistvo te ravni je, da vidimo samo potrjene podatke iz drugih tokov. \u010ce podatki v drugi transakciji \u0161e niso potrjeni, vidimo njihovo prej\u0161njo razli\u010dico.<\/p>\n<p>To nam omogo\u010da, da razporedimo delo namesto \u010dakanja na sprostitev zaklepanja.<\/p>\n<p>Brez posebnih zank ne bomo mogli videti prej\u0161nje razli\u010dice podatkov v IRIS-u, zato se bomo morali zadovoljiti z zaklepanji.<\/p>\n<p>Zadostiti bomo morali z deljenimi zaklepanji, da dovolite branje podatkov le v trenutkih usklajenosti.<\/p>\n<p>Recimo, da imamo bazo uporabnikov ^person, ki si med seboj prena\u0161ajo denar.<\/p>\n<p>Trenutek prenosa od osebe 123 k osebi 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>\nTrenutek zahteve za koli\u010dino denarja pri osebi 123 pred odbitkom mora spremljati izklju\u010dno zaklepanje (privzeto):<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)\nWrite ^person(123)<\/code><\/pre>\n<p>\n\u010ce pa \u017eelimo prikazati stanje ra\u010duna v osebnem ra\u010dunu, lahko uporabimo deljeno zaklepanje ali pa je sploh ne uporabimo:<\/p>\n<pre><code class=\"bash\">LOCK +^person(123)#\u201dS\u201d\nWrite ^person(123)<\/code><\/pre>\n<p>\nVendar pa, \u010de predpostavimo, da se operacije z Bazo podatkov izvajajo prakti\u010dno takoj (spomnim vas, da so globalne spremenljivke veliko bolj nizko nivojske strukture kot relacijska tabela), potreba po tej ravni pade.<\/p>\n<p><b>PONOVLJENO PREBERENO<\/b> \u2014 na tej ravni izolacije je dovoljeno, da obstajajo ve\u010d branj podatkov, ki jih lahko spreminjajo vzporedne transakcije. <\/p>\n<p>Zato bomo morali postaviti deljeno zaklepanje za branje podatkov, ki jih spreminjamo, in izklju\u010dna zaklepanja za podatke, ki jih spreminjamo.<\/p>\n<p>Operator LOCK allows you to list in detail all necessary locks within a single operator, which can be quite numerous.<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)#\u201dS\u201d\nreading ^person(123, amount)<\/code><\/pre>\n<p>\nother operations (at this time, parallel threads are trying to change ^person(123, amount), but cannot)<\/p>\n<pre><code class=\"bash\">LOCK +^person(123, amount)\nmodifying ^person(123, amount)\nLOCK -^person(123, amount)\n\nreading ^person(123, amount)\nLOCK -^person(123, amount)#\u201dS\u201d<\/code><\/pre>\n<p>\nWhen listing locks separated by commas, they are taken sequentially, but if done like this:<\/p>\n<pre><code class=\"bash\">LOCK +(^person(123),^person(242))<\/code><\/pre>\n<p>\nthey are taken atomically all at once.<\/p>\n<p><b>SERIALIZE<\/b> \u2014 we will need to set locks in such a way that, ultimately, all transactions that have common data are executed sequentially. For this approach, most locks must be exclusive and taken over the smallest areas of the global for performance.<\/p>\n<p>However, when it comes to withdrawals in the global ^person, only the SERIALIZE isolation level is acceptable, as money must be spent strictly sequentially, otherwise it is possible to spend the same amount multiple times.<\/p>\n<h2>4. Longevity<\/h2>\n<p>\nI conducted tests with hard container shutdown using<\/p>\n<pre><code class=\"bash\">docker kill my-iris<\/code><\/pre>\n<p>\nThe database handled this well. No problems were identified.<\/p>\n<h2>Zaklju\u010dek<\/h2>\n<p>\nFor globals in InterSystems IRIS, transaction support is available. They are truly atomic, reliable. However, to ensure database consistency in globals, programmer effort and the use of transactions are necessary, as there are no complex built-in constructs like foreign keys.<\/p>\n<p>The isolation level for globals without using locks is READ UNCOMMITTED, and with locks, it can be ensured up to the SERIALIZE level.<\/p>\n<p>The correctness and speed of transactions on globals heavily depend on the programmer's skill: the more widely shared locks are used for reading, the higher the isolation level, and the narrower exclusive locks are taken, the greater the performance.<br \/>\n<br \/>Izvor: <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.4 - 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\/sl\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Transactions in globals of InterSystems IRIS | ProHoster","description":"The InterSystems IRIS DBMS supports interesting structures.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/tranzaktsii-v-globalah-intersystems-iris","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/36650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=36650"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/36650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/27448"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=36650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=36650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=36650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}