InterSystems IRIS global tizimidagi operatsiyalar

InterSystems IRIS global tizimidagi operatsiyalarInterSystems IRIS DBMS ma'lumotlarni saqlash uchun qiziqarli tuzilmalarni - globallarni qo'llab-quvvatlaydi. Asosan, bular tranzaktsiyalar ko'rinishidagi turli xil qo'shimcha sovg'alarga ega, ma'lumotlar daraxtlarini kesib o'tish uchun tezkor funktsiyalar, qulflar va o'zining ObjectScript tiliga ega ko'p darajali kalitlardir.

Globallar haqida ko'proq ma'lumotni "Globallar ma'lumotlarni saqlash uchun xazina qilichlari" maqolalarida o'qing:

Daraxtlar. 1-qism
Daraxtlar. 2-qism
Noyob massivlar. 3-qism

Men global miqyosda tranzaktsiyalar qanday amalga oshirilishi, qanday xususiyatlar mavjudligi bilan qiziqdim. Axir, bu odatiy jadvallardan ko'ra ma'lumotlarni saqlash uchun butunlay boshqacha tuzilma. Juda past daraja.

Relyatsion ma'lumotlar bazalari nazariyasidan ma'lumki, tranzaktsiyalarni yaxshi amalga oshirish talablarni qondirishi kerak ACID:

A - Atom (atomlik). Tranzaktsiyada kiritilgan barcha o'zgarishlar yoki umuman hech kim qayd etilmaydi.

C - izchillik. Tranzaktsiya tugagandan so'ng, ma'lumotlar bazasining mantiqiy holati ichki izchil bo'lishi kerak. Ko'p jihatdan bu talab dasturchiga tegishli, ammo SQL ma'lumotlar bazalari holatida u tashqi kalitlarga ham tegishli.

I - izolyatsiya. Parallel bajariladigan operatsiyalar bir-biriga ta'sir qilmasligi kerak.

D - bardoshli. Tranzaktsiya muvaffaqiyatli yakunlangandan so'ng, quyi darajadagi muammolar (masalan, elektr ta'minoti uzilishi) tranzaktsiya tomonidan o'zgartirilgan ma'lumotlarga ta'sir qilmasligi kerak.

Globallar aloqador bo'lmagan ma'lumotlar tuzilmalaridir. Ular juda cheklangan uskunada juda tez ishlash uchun mo'ljallangan. Keling, global miqyosda tranzaktsiyalarni amalga oshirishni ko'rib chiqaylik rasmiy IRIS docker tasviri.

IRISda tranzaktsiyalarni qo'llab-quvvatlash uchun quyidagi buyruqlar qo'llaniladi: TSTART, TCOMMIT, TROLLAK.

1. Atomlik

Tekshirishning eng oson usuli - atomiklik. Biz ma'lumotlar bazasi konsolidan tekshiramiz.

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

Keyin xulosa qilamiz:

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

Biz olamiz:

1 2 3

Hammasi joyida. Atomlik saqlanib qoladi: barcha o'zgarishlar qayd etiladi.

Keling, vazifani murakkablashtiramiz, xatoni kiritamiz va tranzaksiya qisman yoki umuman saqlanmaganligini ko'raylik.

Atomlikni yana bir bor tekshiramiz:

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

Keyin biz konteynerni majburan to'xtatamiz, uni ishga tushiramiz va ko'ramiz.

docker kill my-iris

Bu buyruq deyarli kuch bilan o'chirishga teng, chunki u jarayonni darhol to'xtatish uchun SIGKILL signalini yuboradi.

Balki tranzaksiya qisman saqlangandir?

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

- Yo'q, omon qolmadi.

Orqaga qaytarish buyrug'ini sinab ko'raylik:

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)

Hech narsa omon qolmagan.

2. Muvofiqlik

Global ma'lumotlar bazasiga asoslangan ma'lumotlar bazalarida kalitlar globallarda ham yaratilganligi sababli (sizga eslatib o'taman, global ma'lumotlarni saqlash uchun relyatsion jadvalga qaraganda past darajadagi tuzilmadir), izchillik talabini qondirish uchun kalitga o'zgartirish kiritilishi kerak. global o'zgarish bilan bir xil tranzaktsiyada.

Misol uchun, bizda global ^ shaxs bor, unda biz shaxsiyatlarni saqlaymiz va biz TINni kalit sifatida ishlatamiz.

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

Familiya va ism bo'yicha tezkor qidiruvni amalga oshirish uchun biz ^ indeks kalitini yaratdik.

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

Ma'lumotlar bazasi izchil bo'lishi uchun biz quyidagi kabi persona qo'shishimiz kerak:

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

Shunga ko'ra, o'chirishda biz ham tranzaksiyadan foydalanishimiz kerak:

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

Boshqacha qilib aytganda, izchillik talabini bajarish butunlay dasturchining yelkasida. Ammo globallar haqida gap ketganda, bu ularning past darajadagi tabiati tufayli normaldir.

3. Izolyatsiya

Bu erda yovvoyi tabiat boshlanadi. Ko'pgina foydalanuvchilar bir vaqtning o'zida bir xil ma'lumotlar bazasida ishlaydi, bir xil ma'lumotlarni o'zgartiradi.

Vaziyatni ko'p foydalanuvchilar bir vaqtning o'zida bir xil kod ombori bilan ishlashlari va bir vaqtning o'zida bir nechta fayllarga o'zgartirishlar kiritishga harakat qilishlari bilan solishtirish mumkin.

Ma'lumotlar bazasi real vaqtda hammasini saralashi kerak. Jiddiy kompaniyalarda versiyalarni boshqarish uchun (filiallarni birlashtirish, nizolarni hal qilish va h.k.) mas'ul bo'lgan maxsus shaxs mavjudligini hisobga olsak va ma'lumotlar bazasi bularning barchasini real vaqt rejimida, vazifaning murakkabligi va to'g'ri bajarilishi kerak. ma'lumotlar bazasi dizayni va unga xizmat ko'rsatadigan kod.

Ma'lumotlar bazasi, agar ular bir xil ma'lumotlar ustida ishlayotgan bo'lsa, nizolarni oldini olish uchun foydalanuvchilar tomonidan bajarilgan harakatlarning ma'nosini tushuna olmaydi. U faqat boshqasiga zid keladigan bitta tranzaksiyani bekor qilishi yoki ularni ketma-ket bajarishi mumkin.

Yana bir muammo shundaki, tranzaktsiyani bajarish jarayonida (majburiyat oldidan) ma'lumotlar bazasining holati mos kelmasligi mumkin, shuning uchun boshqa tranzaktsiyalar ma'lumotlar bazasining mos kelmaydigan holatiga kirish huquqiga ega emasligi ma'qul, bu relyatsion ma'lumotlar bazalarida erishiladi. ko'p jihatdan: suratlarni yaratish, ko'p versiyali qatorlar va boshqalar.

Tranzaktsiyalarni parallel ravishda amalga oshirishda biz uchun ularning bir-biriga xalaqit bermasligi muhimdir. Bu izolyatsiyaning xususiyati.

SQL 4 izolyatsiya darajasini belgilaydi:

  • O'QIShSIZ
  • O'QING
  • KAYTARILAN O'QISH
  • SERIAL BO'LADI

Keling, har bir darajani alohida ko'rib chiqaylik. Har bir darajani amalga oshirish xarajatlari deyarli eksponent ravishda oshadi.

O'QIShSIZ - bu izolyatsiyaning eng past darajasi, lekin ayni paytda eng tez. Tranzaksiyalar bir-biri tomonidan kiritilgan o'zgarishlarni o'qiy oladi.

O'QING keyingi izolyatsiya darajasi bo'lib, bu murosaga erishiladi. Bitimlar bir-birining o'zgarishlarini majburiyatdan oldin o'qiy olmaydi, lekin ular majburiyatdan keyin kiritilgan har qanday o'zgarishlarni o'qishlari mumkin.

Agar bizda T1 bilan bir xil ma'lumotlar bilan ishlagan T2, T3 ... Tn tranzaksiyalarida majburiyatlar amalga oshirilgan T1 uzoq tranzaksiyamiz bo'lsa, T1 ma'lumotlarini so'rashda biz har safar boshqa natijaga erishamiz. Bu hodisa takrorlanmaydigan o'qish deb ataladi.

KAYTARILAN O'QISH — bu izolyatsiya darajasida bizda takrorlanmaydigan o‘qish hodisasi mavjud emas, chunki ma’lumotlarni o‘qishga bo‘lgan har bir so‘rov uchun natija ma’lumotlarining surati yaratiladi va xuddi shu tranzaksiyada qayta foydalanilganda oniy rasmdagi ma’lumotlar olinadi. ishlatilgan. Biroq, bu izolyatsiya darajasida fantom ma'lumotlarini o'qish mumkin. Bu parallel bajarilgan tranzaktsiyalar orqali qo'shilgan yangi qatorlarni o'qishni nazarda tutadi.

SERIAL BO'LADI - izolyatsiyaning eng yuqori darajasi. Bu tranzaksiyada (o'qish yoki o'zgartirish) har qanday usulda foydalanilgan ma'lumotlar birinchi tranzaksiya tugagandan keyingina boshqa tranzaktsiyalar uchun mavjud bo'lishi bilan tavsiflanadi.

Birinchidan, keling, tranzaksiyada operatsiyalarni asosiy oqimdan ajratish mavjudligini aniqlaylik. 2 ta terminal oynasini ochamiz.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Hech qanday izolyatsiya yo'q. Bitta ip tranzaktsiyani ochgan ikkinchisi nima qilayotganini ko'radi.

Keling, turli mavzulardagi tranzaktsiyalar ularning ichida nima sodir bo'layotganini ko'rib chiqaylik.

2 ta terminal oynasini ochamiz va parallel ravishda 2 ta tranzaksiyani ochamiz.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Parallel operatsiyalar bir-birining ma'lumotlarini ko'radi. Shunday qilib, biz eng oddiy, ammo ayni paytda eng tezkor izolyatsiya darajasini oldik, READ UNCOMMITED.

Asosan, buni ishlash har doim ustuvor bo'lgan globallar uchun kutish mumkin edi.

Agar global miqyosdagi operatsiyalarda bizga yuqori darajadagi izolyatsiya kerak bo'lsa-chi?

Bu erda siz izolyatsiya darajalari nima uchun kerakligi va ular qanday ishlashi haqida o'ylashingiz kerak.

Izolyatsiyaning eng yuqori darajasi, SERIALIZE, parallel ravishda amalga oshirilgan tranzaktsiyalar natijasi ularning ketma-ket bajarilishiga teng ekanligini anglatadi, bu esa to'qnashuvlarning yo'qligini kafolatlaydi.

Biz buni ObjectScript-dagi aqlli qulflar yordamida amalga oshirishimiz mumkin, ular juda ko'p turli xil foydalanishga ega: buyruq yordamida muntazam, bosqichma-bosqich, bir nechta qulflashni amalga oshirishingiz mumkin. LOCK.

Pastroq izolyatsiya darajalari ma'lumotlar bazasi tezligini oshirish uchun mo'ljallangan kelishuvdir.

Keling, qulflar yordamida turli darajadagi izolyatsiyaga qanday erishish mumkinligini ko'rib chiqaylik.

Ushbu operator nafaqat ma'lumotlarni o'zgartirish uchun zarur bo'lgan eksklyuziv qulflarni, balki o'qish jarayonida boshqa jarayonlar tomonidan o'zgartirilmasligi kerak bo'lgan ma'lumotlarni o'qish kerak bo'lganda parallel ravishda bir nechta iplarni olishi mumkin bo'lgan umumiy qulflarni olish imkonini beradi.

Rus va ingliz tillarida ikki fazali blokirovka qilish usuli haqida batafsil ma'lumot:

Ikki fazali blokirovka
Ikki fazali qulflash

Qiyinchilik shundaki, tranzaksiya paytida ma'lumotlar bazasining holati mos kelmasligi mumkin, ammo bu nomuvofiq ma'lumotlar boshqa jarayonlarga ko'rinadi. Bundan qanday qochish kerak?

Qulflardan foydalanib, biz ma'lumotlar bazasi holati mos keladigan ko'rinish oynalarini yaratamiz. Va kelishilgan holatni ko'rish oynalariga barcha kirish qulflar tomonidan boshqariladi.

Xuddi shu ma'lumotlarning umumiy qulflari qayta ishlatilishi mumkin - bir nechta jarayonlar ularni olishi mumkin. Ushbu qulflar boshqa jarayonlarning ma'lumotlarni o'zgartirishiga yo'l qo'ymaydi, ya'ni. ular izchil ma'lumotlar bazasi holati oynalarini shakllantirish uchun ishlatiladi.

Ma'lumotlarni o'zgartirish uchun eksklyuziv qulflar qo'llaniladi - faqat bitta jarayon bunday qulfni olishi mumkin. Eksklyuziv qulfni quyidagilardan olish mumkin:

  1. Ma'lumotlar bepul bo'lsa, har qanday jarayon
  2. Faqatgina ushbu ma'lumotlarda umumiy blokirovkaga ega bo'lgan va eksklyuziv qulfni birinchi bo'lib so'ragan jarayon.

InterSystems IRIS global tizimidagi operatsiyalar

Ko'rinish oynasi qanchalik tor bo'lsa, boshqa jarayonlar uni shunchalik uzoq kutishlari kerak, ammo undagi ma'lumotlar bazasining holati shunchalik izchil bo'lishi mumkin.

READ_COMMITTED — bu darajaning mohiyati shundan iboratki, biz faqat boshqa mavzulardan olingan ma'lumotlarni ko'ramiz. Agar boshqa tranzaksiyadagi ma'lumotlar hali amalga oshirilmagan bo'lsa, biz uning eski versiyasini ko'ramiz.

Bu bizga qulfni bo'shatishni kutish o'rniga ishni parallellashtirishga imkon beradi.

Maxsus fokuslarsiz biz IRIS-da ma'lumotlarning eski versiyasini ko'ra olmaymiz, shuning uchun biz qulflar bilan shug'ullanishimiz kerak.

Shunga ko'ra, biz ma'lumotlarni faqat izchillik daqiqalarida o'qishga ruxsat berish uchun umumiy qulflardan foydalanishimiz kerak.

Aytaylik, bizda bir-birlariga pul o'tkazadigan ^ shaxs foydalanuvchi bazasi bor.

123-shaxsdan 242-shaxsga o'tish vaqti:

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)

Hisobdan chiqarishdan oldin 123-shaxsdan pul miqdorini so'rash vaqti eksklyuziv blok bilan birga bo'lishi kerak (sukut bo'yicha):

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

Va agar siz shaxsiy hisobingizda hisob holatini ko'rsatishingiz kerak bo'lsa, siz umumiy qulfdan foydalanishingiz yoki umuman foydalanmasligingiz mumkin:

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

Biroq, agar ma'lumotlar bazasi operatsiyalari deyarli bir zumda amalga oshiriladi deb faraz qilsak (sizga eslatib o'taman, globallar relyatsion jadvalga qaraganda ancha past darajadagi tuzilmadir), u holda bu darajaga ehtiyoj kamayadi.

KAYTARILAN O'QISH - Bu izolyatsiya darajasi bir vaqtning o'zida tranzaktsiyalar orqali o'zgartirilishi mumkin bo'lgan ma'lumotlarni bir necha marta o'qish imkonini beradi.

Shunga ko'ra, biz o'zimiz o'zgartiradigan ma'lumotlarni o'qish uchun umumiy blokirovka va biz o'zgartiradigan ma'lumotlarga eksklyuziv qulf qo'yishimiz kerak bo'ladi.

Yaxshiyamki, LOCK operatori sizga bitta bayonotda ko'p bo'lishi mumkin bo'lgan barcha kerakli qulflarni batafsil sanab o'tishga imkon beradi.

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

boshqa operatsiyalar (hozirgi vaqtda parallel iplar ^person(123, summa) o'zgartirishga harakat qiladi, lekin qila olmaydi)

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

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

Qulflarni vergul bilan ajratilgan ro'yxatda ular ketma-ket olinadi, lekin agar shunday qilsangiz:

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

keyin ular birdaniga atomik tarzda olinadi.

SERIALLASH — umumiy maʼlumotlarga ega boʻlgan barcha tranzaktsiyalar ketma-ket bajarilishi uchun biz qulflarni oʻrnatishimiz kerak. Ushbu yondashuv uchun ko'pchilik qulflar eksklyuziv bo'lishi va ishlash uchun global eng kichik sohalarda olinishi kerak.

Agar biz global ^shaxsda mablag'larni debet qilish haqida gapiradigan bo'lsak, u uchun faqat SERIALIZE izolyatsiya darajasi maqbuldir, chunki pul qat'iy ketma-ketlikda sarflanishi kerak, aks holda bir xil miqdorni bir necha marta sarflash mumkin.

4. Chidamlilik

Men konteynerni qattiq kesish bilan sinovlarni o'tkazdim

docker kill my-iris

Baza ularga yaxshi toqat qildi. Hech qanday muammo aniqlanmadi.

xulosa

Globallar uchun InterSystems IRIS tranzaksiyani qo'llab-quvvatlaydi. Ular haqiqatan ham atomik va ishonchli. Global ma'lumotlar bazasiga asoslangan ma'lumotlar bazasining izchilligini ta'minlash uchun dasturchining harakatlari va tranzaktsiyalardan foydalanish talab etiladi, chunki unda xorijiy kalitlar kabi murakkab o'rnatilgan konstruktsiyalar mavjud emas.

Qulflardan foydalanmasdan globallarning izolyatsiya darajasi READ UNCOMMITED hisoblanadi va qulflardan foydalanganda uni SERIALIZE darajasiga qadar ta'minlash mumkin.

Global miqyosdagi tranzaktsiyalarning to'g'riligi va tezligi dasturchining mahoratiga bog'liq: o'qish paytida umumiy qulflar qanchalik keng qo'llanilsa, izolyatsiya darajasi qanchalik baland bo'lsa va qanchalik tor eksklyuziv qulflar olinsa, ishlash tezroq bo'ladi.

Manba: www.habr.com

a Izoh qo'shish