InterSystems IRIS глобал дахь гүйлгээ

InterSystems IRIS глобал дахь гүйлгээInterSystems IRIS DBMS нь өгөгдөл хадгалах сонирхолтой бүтцийг дэмждэг - globals. Үндсэндээ эдгээр нь гүйлгээ, өгөгдлийн мод, түгжээ, өөрийн 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. Тууштай байдал

Глобал дээр суурилсан өгөгдлийн санд түлхүүрүүд нь глобал дээр хийгдсэн байдаг тул (глобал нь харилцааны хүснэгтээс өгөгдөл хадгалах доод түвшний бүтэц гэдгийг танд сануулъя) тууштай байдлын шаардлагыг хангахын тулд түлхүүрийн өөрчлөлтийг оруулах ёстой. дэлхийн өөрчлөлттэй ижил гүйлгээнд .

Жишээлбэл, бид хувийн шинж чанаруудыг хадгалдаг, TIN-г түлхүүр болгон ашигладаг дэлхийн ^ хүнтэй.

^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-ийн ухаалаг түгжээг ашиглан хийж болох бөгөөд энэ нь маш олон төрлийн хэрэглээтэй: та тушаалаар тогтмол, нэмэгдэл, олон түгжээ хийж болно. LOCK.

Доод тусгаарлах түвшин нь мэдээллийн сангийн хурдыг нэмэгдүүлэх зорилготой солилцоо юм.

Түгжээ ашиглан тусгаарлах янз бүрийн түвшинд хэрхэн хүрч болохыг харцгаая.

Энэ оператор нь өгөгдлийг өөрчлөхөд шаардлагатай онцгой түгжээг авах төдийгүй, унших явцад бусад процессоор өөрчлөгдөх ёсгүй өгөгдлийг унших шаардлагатай үед хэд хэдэн хэлхээг зэрэгцүүлэн авч болох хуваалцсан түгжээг авах боломжийг олгодог.

Орос, англи хэл дээр хоёр фазын блоклох аргын талаар дэлгэрэнгүй мэдээлэл:

Хоёр фазын хаалт
Хоёр фазын түгжээ

Хэцүү тал нь гүйлгээ хийх явцад мэдээллийн сангийн төлөв байдал нийцэхгүй байж болох ч энэхүү үл нийцэх өгөгдөл нь бусад процессуудад харагдана. Үүнээс хэрхэн зайлсхийх вэ?

Түгжээг ашиглан бид мэдээллийн сангийн төлөв тогтвортой байх харагдах цонхыг бий болгоно. Мөн тохиролцсон төлөвийн харагдахуйц ийм цонх руу нэвтрэх бүх хандалтыг түгжээгээр хянах болно.

Нэг өгөгдлийн хуваалцсан түгжээг дахин ашиглах боломжтой-хэд хэдэн процесс тэдгээрийг авч болно. Эдгээр түгжээ нь бусад процессууд өгөгдлийг өөрчлөхөөс сэргийлдэг, i.e. Эдгээр нь тогтмол мэдээллийн сангийн төлөвтэй цонх үүсгэхэд ашиглагддаг.

Өгөгдлийн өөрчлөлтөд онцгой түгжээг ашигладаг - зөвхөн нэг процесс ийм түгжээг авах боломжтой. Онцгой түгжээг дараахь байдлаар авч болно.

  1. Хэрэв өгөгдөл үнэ төлбөргүй бол аливаа процесс
  2. Зөвхөн энэ өгөгдөл дээр хуваалцсан түгжээтэй бөгөөд онцгой түгжээг хүссэн анхны процесс.

InterSystems IRIS глобал дахь гүйлгээ

Харагдах цонх нь нарийсах тусам бусад процессууд удаан хүлээх болно, гэхдээ өгөгдлийн сангийн төлөв байдал төдий чинээ тогтвортой байх болно.

УНШИСАН_ҮҮДЭЭ - энэ түвшний мөн чанар нь бид зөвхөн бусад хэлхээнүүдийн хийсэн өгөгдлийг хардаг явдал юм. Хэрэв өөр гүйлгээний өгөгдөл хараахан хийгдээгүй бол бид түүний хуучин хувилбарыг харах болно.

Энэ нь түгжээг суллахыг хүлээхийн оронд ажлыг зэрэгцээ хийх боломжийг бидэнд олгодог.

Тусгай заль мэхгүйгээр бид 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)

бусад үйлдлүүд (энэ үед зэрэгцээ хэлхээнүүд ^person(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 түвшинд хүртэл хангагдах боломжтой.

Глобал дахь гүйлгээний зөв, хурд нь програмистын ур чадвараас ихээхэн хамаардаг: уншихад илүү өргөн тархсан түгжээг ашиглах тусам тусгаарлах түвшин өндөр байх тусам илүү нарийхан онцгой түгжээ авах тусам гүйцэтгэл хурдан болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх