Муомилот дар InterSystems IRIS globals

Муомилот дар InterSystems IRIS globalsInterSystems IRIS DBMS сохторҳои ҷолибро барои нигоҳ доштани маълумот - глобалӣ дастгирӣ мекунад. Аслан, инҳо калидҳои бисёрсатҳи бо чизҳои гуногуни иловагӣ дар шакли транзаксияҳо, функсияҳои зуд барои гузаштан аз дарахтони маълумот, қулфҳо ва забони ObjectScript-и худ мебошанд.

Муфассалтар дар бораи глобалҳо дар силсилаи мақолаҳои "Глобалҳо шамшерҳои ганҷ барои нигоҳ доштани маълумот":

Дарахтон. Қисми 1
Дарахтон. Қисми 2
Массивҳои пароканда. Қисми 3

Ман ба он таваҷҷӯҳ доштам, ки транзаксияҳо дар ҷаҳон чӣ гуна амалӣ мешаванд, кадом хусусиятҳо мавҷуданд. Дар ниҳоят, ин сохтори нигоҳдории маълумот аз ҷадвалҳои муқаррарӣ комилан дигар аст. Сатҳи хеле пасттар.

Тавре ки аз назарияи базаи маълумотҳои релятсионӣ маълум аст, татбиқи хуби транзаксияҳо бояд ба талабот ҷавобгӯ бошад Кислота:

A - Атомӣ (атомӣ). Ҳама тағиротҳое, ки дар транзаксия ворид карда шудаанд ё тамоман сабт карда намешаванд.

C - Мутобиқати. Пас аз анҷоми транзаксия, ҳолати мантиқии пойгоҳи додаҳо бояд дар дохили он мувофиқ бошад. Аз бисёр ҷиҳат ин талабот ба барномасоз дахл дорад, аммо дар мавриди базаҳои SQL он ба калидҳои хориҷӣ низ дахл дорад.

Ман - Изол. Муомилаҳои параллелӣ набояд ба ҳамдигар таъсир расонанд.

D - устувор. Пас аз анҷоми бомуваффақияти транзаксия, мушкилот дар сатҳҳои поёнӣ (масалан, нокомии барқ) набояд ба маълумоти тағирёфтаи транзаксия таъсир расонад.

Глобалҳо сохторҳои иттилоотии ғайрирасмӣ мебошанд. Онҳо тарҳрезӣ шуда буданд, ки дар сахтафзори хеле маҳдуд кор кунанд. Биёед татбиқи транзаксияҳоро дар глобалӣ истифода барем тасвири расмии докери IRIS.

Барои дастгирии транзаксияҳо дар IRIS, фармонҳои зерин истифода мешаванд: TSTART, TCOMMIT, ТРОЛЛБЕК.

1. Атомӣ

Роҳи осонтарини тафтиш атомӣ аст. Мо аз консоли пойгоҳи додаҳо тафтиш мекунем.

Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMIT

Сипас мо хулоса мекунем:

Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)

Мо ба даст меорем:

1 2 3

Ҳама чиз хуб аст. Атомӣ нигоҳ дошта мешавад: ҳама тағиротҳо сабт карда мешаванд.

Биёед вазифаро душвор созем, хатогӣ ҷорӣ кунем ва бубинем, ки транзаксия чӣ гуна захира карда мешавад, қисман ё тамоман нест.

Биёед бори дигар атомиро тафтиш кунем:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3

Он гоҳ мо контейнерро маҷбуран боздошта, онро ба кор меандозем ва мебинем.

docker kill my-iris

Ин фармон тақрибан ба хомӯш кардани маҷбурӣ баробар аст, зеро он сигнали SIGKILL мефиристад, то раванд фавран қатъ карда шавад.

Шояд транзаксия қисман наҷот ёфт?

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

- Не, зинда нашудааст.

Биёед фармони бозгаштро санҷем:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TROLLBACK

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

Ҳеҷ чиз низ зинда намондааст.

2. Мутобиқатӣ

Азбаски дар пойгоҳи додаҳо дар асоси глобалӣ, калидҳо инчунин дар глобалҳо сохта мешаванд (иҷозат диҳед ба шумо хотиррасон кунам, ки глобалӣ сохтори сатҳи поёнтар барои нигоҳдории маълумот аст, нисбат ба ҷадвали релятсионӣ), барои қонеъ кардани талаботи мувофиқат, тағирот дар калид бояд дохил карда шавад. дар ҳамон транзаксия ҳамчун тағйирот дар ҷаҳон.

Масалан, мо одами глобалӣ дорем, ки дар он шахсиятҳоро нигоҳ медорем ва ТИН-ро ҳамчун калид истифода мебарем.

^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...

Барои он ки аз рӯи насаб ва ном зуд ҷустуҷӯ кунем, мо калиди ^ индексро сохтем.

^index(‘Kamenev’, ‘Sergey’, 1234567) = 1

Барои он ки пойгоҳи додаҳо мувофиқ бошад, мо бояд шахсро ба таври зерин илова кунем:

TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMIT

Ҳамин тариқ, ҳангоми нест кардан мо бояд транзаксияро низ истифода барем:

TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMIT

Ба ибораи дигар, иҷрои талаботи мувофиқат комилан ба дӯши барномасоз аст. Аммо вақте ки сухан дар бораи глобалӣ меравад, ин муқаррарӣ аст, бинобар табиати сатҳи пасти онҳо.

3. Изолятсия

Дар ин ҷо ваҳшӣ оғоз мешавад. Бисёр корбарон ҳамзамон дар як пойгоҳи додаҳо кор мекунанд ва ҳамон маълумотро иваз мекунанд.

Вазъиятро бо он муқоиса кардан мумкин аст, ки бисёр корбарон ҳамзамон бо ҳамон як анбори код кор мекунанд ва кӯшиш мекунанд, ки дар як вақт ба бисёр файлҳо тағирот ворид кунанд.

Махзани маълумот бояд ҳама чизро дар вақти воқеӣ ҷудо кунад. Бо дарназардошти он, ки дар ширкатҳои ҷиддӣ ҳатто як шахси махсусе вуҷуд дорад, ки барои назорати версияҳо (барои муттаҳид кардани филиалҳо, ҳалли ихтилофҳо ва ғайра) масъул аст ва базаи маълумот бояд ҳамаи инро дар вақти воқеӣ, мураккабии вазифа ва дурустии иҷроиш иҷро кунад. тарҳи пойгоҳи додаҳо ва коде, ки ба он хидмат мекунад.

Пойгоҳи додаҳо маънои амалҳои аз ҷониби корбарон иҷрошударо дарк карда наметавонад, то аз ихтилофҳо пешгирӣ карда шавад, агар онҳо дар як маълумот кор кунанд. Он метавонад танҳо як транзаксияеро, ки бо дигараш мухолиф аст, бекор кунад ё онҳоро пайдарпай иҷро кунад.

Мушкилоти дигар дар он аст, ки ҳангоми иҷрои транзаксия (пеш аз ӯҳдадорӣ) ҳолати махзани маълумот метавонад номувофиқ бошад, бинобар ин матлуб аст, ки транзаксияҳои дигар ба ҳолати номувофиқии пойгоҳи додаҳо, ки дар пойгоҳи додаҳои релятсионӣ ба даст оварда мешаванд, дастрасӣ надошта бошанд. аз бисёр ҷиҳатҳо: эҷоди аксҳо, сатрҳои гуногунранг ва ғайра.

Ҳангоми мувозинат анҷом додани транзаксияҳо барои мо муҳим аст, ки онҳо ба ҳамдигар халал нарасонанд. Ин моликияти изолятсия аст.

SQL 4 сатҳи изолятсияро муайян мекунад:

  • ХОНДА ШУДААСТ
  • ХОНДА МЕШАВАД
  • ХОНДАНИ ТАКРОР
  • СЕРИАЛИСТОН

Биёед ҳар як сатҳро алоҳида дида бароем. Хароҷоти татбиқи ҳар як сатҳ қариб ба таври экспоненсиалӣ меафзояд.

ХОНДА ШУДААСТ - ин сатҳи пасттарини изолятсия, аммо дар айни замон зудтарин аст. Муомилот метавонанд тағиротҳои аз ҷониби ҳамдигар воридшударо хонанд.

ХОНДА МЕШАВАД зинаи навбатии бунбаст аст, ки созиш аст. Муомилот наметавонанд тағироти ҳамдигарро пеш аз ӯҳдадорӣ хонанд, аммо онҳо метавонанд ҳама гуна тағиротро, ки пас аз ӯҳдадорӣ ворид шудаанд, бихонанд.

Агар мо як транзаксияи тӯлонии T1 дошта бошем, ки дар ҷараёни он ӯҳдадориҳо дар транзаксияҳои T2, T3 ... Tn, ки бо ҳамон маълумоте, ки T1 кор мекарданд, сурат мегирифтанд, пас ҳангоми дархост кардани маълумот дар T1 мо ҳар дафъа натиҷаи дигар мегирем. Ин падидаро хониши такрорнашаванда меноманд.

ХОНДАНИ ТАКРОР — дар ин сатҳи изолятсия мо падидаи хондани такрорнашавандаро надорем, зеро барои ҳар як дархост барои хондани маълумот акси маълумоти натиҷавӣ сохта мешавад ва ҳангоми истифодаи такрорӣ дар як транзаксия, маълумот аз аксбардорӣ истифода мешавад. Аммо, дар ин сатҳи изолятсия маълумоти фантомро хондан мумкин аст. Ин ба хондани сатрҳои нав дахл дорад, ки тавассути муомилоти мувозӣ илова карда шудаанд.

СЕРИАЛИСТОН — дарачаи баландтарини изоляция. Он бо он тавсиф мешавад, ки маълумоте, ки дар ҳама гуна тарз истифода мешавад (хондан ё тағир додан) танҳо пас аз анҷоми муомилоти аввал дастраси дигар амалиётҳо мегардад.

Аввалан, биёед бифаҳмем, ки оё ҷудокунии амалиёт дар транзаксия аз риштаи асосӣ вуҷуд дорад. Биёед 2 тирезаи терминалро кушоем.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Ягон изолятсия вуҷуд надорад. Як ришта мебинад, ки дигаре, ки муомилотро кушод, чӣ кор карда истодааст.

Биёед бубинем, ки оё транзаксияҳои риштаҳои гуногун мебинанд, ки дар дохили онҳо чӣ рӯй дода истодааст.

Биёед 2 равзанаи терминалро кушоем ва 2 транзаксияро дар як вақт кушоем.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Амалиётҳои мувозӣ маълумоти ҳамдигарро мебинанд. Ҳамин тавр, мо сатҳи соддатарин, вале зудтаринро гирифтем, READ UNCOMMITED.

Аслан, инро метавон барои ҷаҳониён интизор шуд, ки иҷрои онҳо ҳамеша авлавият дошт.

Чӣ мешавад, агар ба мо дар амалиётҳо дар ҷаҳон сатҳи баландтари изолятсия лозим бошад?

Дар ин ҷо шумо бояд фикр кунед, ки чаро сатҳи изолятсия умуман лозим аст ва онҳо чӣ гуна кор мекунанд.

Сатҳи баландтарини изолятсия, SERIALIZE, маънои онро дорад, ки натиҷаи транзаксияҳои мувозӣ иҷрошуда ба иҷрои пайдарпайи онҳо баробар аст, ки мавҷуд набудани бархӯрдҳоро кафолат медиҳад.

Мо инро метавонем бо истифода аз қуфлҳои интеллектуалӣ дар ObjectScript иҷро кунем, ки истифодаи зиёди онҳо гуногунанд: шумо метавонед бо фармон қулфкунии мунтазам, афзоянда ва чандкаратаро иҷро кунед. пайваст кардан.

Сатҳи изолятсияи поёнтар ин муомилаҳое мебошанд, ки барои баланд бардоштани суръати пойгоҳи додаҳо пешбинӣ шудаанд.

Биёед бубинем, ки чӣ тавр мо метавонем бо истифода аз қуфлҳо сатҳи гуногуни изолятсияро ба даст орем.

Ин оператор ба шумо имкон медиҳад, ки на танҳо қуфлҳои истисноии барои тағир додани маълумот, балки қулфҳои ба истилоҳ муштарак, ки метавонанд якчанд риштаҳоро дар баробари хондани маълумот гиранд, ки ҳангоми хондан аз ҷониби дигар равандҳо набояд тағир дода шаванд.

Маълумоти бештар дар бораи усули бастани дуфаза бо забонҳои русӣ ва англисӣ:

Блоки дуфазавӣ
Қулфи дуфаза

Мушкилот дар он аст, ки ҳангоми транзаксия ҳолати базаи маълумот метавонад номувофиқ бошад, аммо ин маълумоти номувофиқ барои равандҳои дигар намоён аст. Чӣ тавр аз ин пешгирӣ кардан мумкин аст?

Бо истифода аз қуфлҳо, мо тирезаҳои намоёнро эҷод мекунем, ки дар онҳо ҳолати пойгоҳи додаҳо мувофиқ хоҳад буд. Ва ҳама дастрасӣ ба чунин тирезаҳои намоёни ҳолати мувофиқашуда тавассути қуфлҳо назорат карда мешаванд.

Қулфҳои муштарак дар як маълумот дубора истифода мешаванд - якчанд равандҳо метавонанд онҳоро гиранд. Ин қуфлҳо равандҳои дигарро аз тағир додани маълумот пешгирӣ мекунанд, яъне. онҳо барои ташкили равзанаҳои ҳолати доимии пойгоҳи додаҳо истифода мешаванд.

Қулфҳои истисноӣ барои тағир додани маълумот истифода мешаванд - танҳо як раванд метавонад чунин қулфро гирад. Қулфи истисноӣ метавонад аз ҷониби:

  1. Ҳар гуна раванд, агар маълумот ройгон бошад
  2. Танҳо раванде, ки дар ин маълумот қулфи муштарак дорад ва аввалин шуда қулфи истисноиро дархост кардааст.

Муомилот дар InterSystems IRIS globals

Чӣ қадаре ки равзанаи аёнӣ тангтар бошад, равандҳои дигар бояд ҳамон қадар дарозтар интизор шаванд, аммо ҳолати пойгоҳи додаҳо дар дохили он ҳамон қадар мувофиқтар бошад.

ХОНДАН_КАРДА ШУД — мохияти ин сатх дар он аст, ки мо аз дигар риштахо танхо маълумотхои супурдашударо мебинем. Агар маълумот дар амалиёти дигар ҳанӯз содир нашуда бошад, пас мо версияи кӯҳнаи онро мебинем.

Ин ба мо имкон медиҳад, ки ба ҷои мунтазири озод шудани қулф корро параллел кунем.

Бе ҳиллаҳои махсус, мо версияи кӯҳнаи маълумотро дар IRIS дида наметавонем, аз ин рӯ мо бояд бо қулфҳо кор кунем.

Аз ин рӯ, мо бояд қуфлҳои муштаракро истифода барем, то маълумотро танҳо дар лаҳзаҳои мувофиқ хондан иҷозат диҳем.

Фарз мекунем, ки мо базаи истифодабарандаи ^ шахсе дорем, ки ба якдигар пул мегузаронад.

Лаҳзаи интиқол аз шахси 123 ба шахси 242:

LOCK +^person(123), +^person(242)
Set ^person(123, amount) = ^person(123, amount) - amount
Set ^person(242, amount) = ^person(242, amount) + amount
LOCK -^person(123), -^person(242)

Лаҳзаи дархости маблағи пул аз шахси 123 пеш аз дебет бояд бо блоки истисноӣ ҳамроҳ карда шавад (ба таври пешфарз):

LOCK +^person(123)
Write ^person(123)

Ва агар ба шумо лозим аст, ки ҳолати ҳисобро дар ҳисоби шахсии худ нишон диҳед, пас шумо метавонед қулфи муштаракро истифода баред ё онро умуман истифода набаред:

LOCK +^person(123)#”S”
Write ^person(123)

Аммо, агар мо фарз кунем, ки амалиёти пойгоҳи додаҳо қариб фавран иҷро карда мешавад (иҷозат диҳед ба шумо хотиррасон кунам, ки глобалҳо нисбат ба ҷадвали релятсионӣ сохтори сатҳи хеле пасттаранд), пас талабот ба ин сатҳ коҳиш меёбад.

ХОНДАНИ ТАКРОР - Ин сатҳи изолятсия имкон медиҳад, ки маълумоти сершуморро хонед, ки онҳоро тавассути транзаксияҳои ҳамзамон тағир додан мумкин аст.

Бинобар ин, мо бояд барои хондани маълумоте, ки мо тағир медиҳем, қулфи муштарак ва қулфҳои истисноии маълумотеро, ки мо тағир медиҳем, гузорем.

Хушбахтона, оператори LOCK ба шумо имкон медиҳад, ки ҳама қуфлҳои заруриро, ки метавонанд дар як изҳорот хеле зиёд бошанд, номбар кунед.

LOCK +^person(123, amount)#”S”
чтение ^person(123, amount)

амалиёти дигар (дар айни замон риштаҳои параллелӣ кӯшиш мекунанд, ки ^ шахсро (123, маблағ) иваз кунанд, аммо наметавонанд)

LOCK +^person(123, amount)
изменение ^person(123, amount)
LOCK -^person(123, amount)

чтение ^person(123, amount)
LOCK -^person(123, amount)#”S”

Ҳангоми рӯйхати қулфҳо, ки бо вергул ҷудо шудаанд, онҳо пайдарпай гирифта мешаванд, аммо агар шумо ин корро кунед:

LOCK +(^person(123),^person(242))

пас онхо якбора ба таври атомй гирифта мешаванд.

ХИДМАТ КУНЕД — мо бояд қуфлҳоро тавре гузорем, ки дар ниҳоят ҳамаи амалиётҳое, ки маълумоти умумӣ доранд, пайдарпай иҷро карда шаванд. Барои ин равиш, аксари қуфлҳо бояд истисноӣ бошанд ва дар хурдтарин минтақаҳои ҷаҳон барои иҷроиш гирифта шаванд.

Агар мо дар бораи дебети маблағҳо дар шахси глобалӣ сухан ронем, пас барои он танҳо сатҳи изолятсияи SERIALIZE қобили қабул аст, зеро пул бояд ба таври қатъӣ пай дар пай сарф карда шавад, вагарна ҳамон маблағро якчанд маротиба сарф кардан мумкин аст.

4. Давомнокӣ

Ман бо истифода аз буридани сахти зарф озмоишҳо гузаронидам

docker kill my-iris

База ба онхо нагз тоб овард. Ягон мушкилот муайян карда нашуд.

хулоса

Барои ҷаҳониён, InterSystems IRIS дорои транзаксия мебошад. Онҳо дар ҳақиқат атомӣ ва боэътимод мебошанд. Барои таъмини мутобиқати пойгоҳи додаҳо дар асоси глобалӣ, кӯшишҳои барномасоз ва истифодаи транзаксияҳо лозиманд, зеро он дорои сохторҳои мураккаби дарунсохт, ба монанди калидҳои хориҷӣ нест.

Сатҳи изолятсияи глобалҳо бе истифодаи қулфҳо READ UNCOMMITED аст ва ҳангоми истифодаи қуфлҳо онро то сатҳи SERIALIZE таъмин кардан мумкин аст.

Дурустӣ ва суръати транзаксияҳо дар глобалӣ аз маҳорати барномасоз вобаста аст: ҳангоми хондан қуфлҳои бештар паҳншуда истифода мешаванд, сатҳи ҷудошавӣ баландтар аст ва қуфлҳои истисноии тангтар гирифта мешаванд, иҷроиш ҳамон қадар тезтар мешавад.

Манбаъ: will.com

Илова Эзоҳ