InterSystems IRIS qlobal sistemlərində əməliyyatlar

InterSystems IRIS qlobal sistemlərində əməliyyatlarInterSystems IRIS DBMS məlumatların saxlanması üçün maraqlı strukturları - qlobalları dəstəkləyir. Əsasən, bunlar əməliyyatlar şəklində müxtəlif əlavə hədiyyələri, məlumat ağaclarını keçmək üçün sürətli funksiyaları, kilidləri və öz ObjectScript dilini olan çoxsəviyyəli açarlardır.

“Qloballar məlumatların saxlanması üçün xəzinə qılıncıdır” məqalələr silsiləsində qloballar haqqında daha çox oxuyun:

Ağaclar. 1-ci hissə
Ağaclar. 2-ci hissə
Seyrək massivlər. 3-cü hissə

Qloballarda əməliyyatların necə həyata keçirildiyi, hansı xüsusiyyətlərin olduğu ilə maraqlandım. Axı, bu, adi cədvəllərdən daha çox məlumatların saxlanması üçün tamamilə fərqli bir quruluşdur. Çox aşağı səviyyə.

Əlaqəli verilənlər bazası nəzəriyyəsindən məlum olduğu kimi, əməliyyatların yaxşı həyata keçirilməsi tələblərə cavab verməlidir ACID:

A - Atom (atomluq). Əməliyyatda edilən bütün dəyişikliklər və ya heç biri qeydə alınmır.

C - ardıcıllıq. Əməliyyat başa çatdıqdan sonra verilənlər bazasının məntiqi vəziyyəti daxili ardıcıl olmalıdır. Bir çox cəhətdən bu tələb proqramçıya aiddir, lakin SQL verilənlər bazası vəziyyətində xarici açarlara da aiddir.

Mən - təcrid. Paralel şəkildə aparılan əməliyyatlar bir-birinə təsir etməməlidir.

D - Davamlı. Tranzaksiya uğurla başa çatdıqdan sonra, aşağı səviyyələrdəki problemlər (məsələn, elektrik kəsilməsi) əməliyyat tərəfindən dəyişdirilmiş məlumatlara təsir etməməlidir.

Qloballar əlaqəli olmayan məlumat strukturlarıdır. Onlar çox məhdud avadanlıqda super sürətli işləmək üçün nəzərdə tutulmuşdur. istifadə edərək qlobal əməliyyatların həyata keçirilməsinə baxaq rəsmi IRIS docker şəkli.

IRIS-də əməliyyatları dəstəkləmək üçün aşağıdakı əmrlərdən istifadə olunur: TSTART, TCOMMIT, TROLLBERK.

1. Atomluq

Yoxlamağın ən asan yolu atomiklikdir. Verilənlər bazası konsolundan yoxlayırıq.

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

Sonra yekunlaşdırırıq:

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

Biz əldə edirik:

1 2 3

Hər şey yaxşıdır. Atomluq qorunur: bütün dəyişikliklər qeydə alınır.

Tapşırığı çətinləşdirək, bir səhv təqdim edək və əməliyyatın qismən və ya ümumiyyətlə necə saxlandığını görək.

Atomluğu yenidən yoxlayaq:

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

Sonra konteyneri zorla dayandıracağıq, işə salacağıq və görəcəyik.

docker kill my-iris

Bu əmr, prosesi dərhal dayandırmaq üçün SIGKILL siqnalı göndərdiyi üçün demək olar ki, güclə bağlanmağa bərabərdir.

Bəlkə əməliyyat qismən saxlanılıb?

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

- Yox, sağ qalmayıb.

Geri qaytarma əmrini sınayaq:

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)

Heç nə də sağ qalmayıb.

2. Ardıcıllıq

Qloballara əsaslanan verilənlər bazalarında açarlar qloballar üzərində də hazırlandığından (xatırlatmaq istərdim ki, qlobal məlumatların saxlanması üçün əlaqəli cədvəldən daha aşağı səviyyəli strukturdur), ardıcıllıq tələbinə cavab vermək üçün açarda dəyişiklik daxil edilməlidir. qlobal bir dəyişiklik kimi eyni əməliyyatda.

Məsələn, şəxsiyyətləri saxladığımız və VÖEN-i açar kimi istifadə etdiyimiz qlobal ^şəxsimiz var.

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

Soyad və adla tez axtarış etmək üçün ^index açarını yaratdıq.

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

Verilənlər bazasının ardıcıl olması üçün bu kimi persona əlavə etməliyik:

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

Müvafiq olaraq, silərkən biz də əməliyyatdan istifadə etməliyik:

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

Başqa sözlə, ardıcıllıq tələbinin yerinə yetirilməsi tamamilə proqramçının çiyninə düşür. Qloballara gəldikdə isə, bu, onların aşağı səviyyəli xarakterinə görə normaldır.

3. İzolyasiya

Vəhşilərin başladığı yer budur. Bir çox istifadəçi eyni vaxtda eyni verilənlər bazasında işləyir, eyni məlumatları dəyişir.

Vəziyyət bir çox istifadəçinin eyni vaxtda eyni kod anbarı ilə işlədiyi və eyni zamanda bir çox fayla eyni vaxtda dəyişikliklər etməyə çalışdığı ilə müqayisə edilə bilər.

Verilənlər bazası hamısını real vaxtda çeşidləməlidir. Nəzərə alsaq ki, ciddi şirkətlərdə hətta versiyaya nəzarət üçün (filialların birləşdirilməsi, konfliktlərin həlli və s.) cavabdeh olan xüsusi bir şəxs var və verilənlər bazası bütün bunları real vaxt rejimində yerinə yetirməlidir, tapşırığın mürəkkəbliyi və işin düzgün yerinə yetirilməsi. verilənlər bazası dizaynı və ona xidmət edən kod.

Verilənlər bazası istifadəçilər eyni verilənlər üzərində işləyirlərsə, münaqişələrin qarşısını almaq üçün etdikləri hərəkətlərin mənasını başa düşə bilmir. O, yalnız digəri ilə ziddiyyət təşkil edən bir əməliyyatı ləğv edə və ya onları ardıcıl olaraq icra edə bilər.

Başqa bir problem ondan ibarətdir ki, əməliyyatın icrası zamanı (öhdəlikdən əvvəl) verilənlər bazasının vəziyyəti uyğunsuz ola bilər, ona görə də arzuolunandır ki, digər əməliyyatlar verilənlər bazasının uyğunsuz vəziyyətinə daxil olmasın ki, bu da relational verilənlər bazalarında əldə edilir. bir çox cəhətdən: anlıq görüntülər yaratmaq, çox versiyalı sıralar və s.

Paralel olaraq əməliyyatlar apararkən onların bir-birinə mane olmaması bizim üçün vacibdir. Bu izolyasiyanın xüsusiyyətidir.

SQL 4 izolyasiya səviyyəsini müəyyən edir:

  • TƏQDİM EDİLMƏDİ OXUYUN
  • OXUYUN
  • TEKRAR OXUYUR
  • SERİYALANABİLƏN

Gəlin hər səviyyəyə ayrıca baxaq. Hər bir səviyyənin həyata keçirilməsi xərcləri demək olar ki, eksponent olaraq artır.

TƏQDİM EDİLMƏDİ OXUYUN - bu izolyasiyanın ən aşağı səviyyəsidir, lakin eyni zamanda ən sürətli. Əməliyyatlar bir-birinin etdiyi dəyişiklikləri oxuya bilər.

OXUYUN kompromis olan növbəti təcrid səviyyəsidir. Əməliyyatlar öhdəlikdən əvvəl bir-birinin dəyişikliklərini oxuya bilməz, lakin öhdəlikdən sonra edilən hər hansı dəyişikliyi oxuya bilər.

Əgər T1 ilə eyni verilənlərlə işləyən T2, T3 ... Tn əməliyyatlarında öhdəliklərin aparıldığı uzun T1 əməliyyatımız varsa, T1-də məlumat tələb edərkən hər dəfə fərqli nəticə əldə edəcəyik. Bu fenomen təkrar olunmayan oxu adlanır.

TEKRAR OXUYUR — bu təcrid səviyyəsində bizdə təkrarolunmaz oxu fenomeni yoxdur, çünki verilənlərin oxunması üçün hər sorğu üçün nəticə məlumatlarının snapshotı yaradılır və eyni əməliyyatda təkrar istifadə edildikdə, snapshotdan verilənlər istifadə olunur. Bununla belə, bu izolyasiya səviyyəsində fantom məlumatları oxumaq mümkündür. Bu, paralel həyata keçirilən əməliyyatlar tərəfindən əlavə edilmiş yeni sətirlərin oxunmasına aiddir.

SERİYALANABİLƏN - ən yüksək izolyasiya səviyyəsi. Bu, əməliyyatda hər hansı şəkildə istifadə olunan məlumatların (oxumaq və ya dəyişdirmək) yalnız birinci əməliyyat başa çatdıqdan sonra digər əməliyyatlar üçün əlçatan olması ilə xarakterizə olunur.

Əvvəlcə bir əməliyyatda əməliyyatların əsas ipdən təcrid olunmasının olub olmadığını anlayaq. 2 terminal pəncərəsini açaq.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

İzolyasiya yoxdur. Bir iplik əməliyyatı açan ikincinin nə etdiyini görür.

Gəlin görək, müxtəlif mövzuların əməliyyatları onların içərisində nə baş verdiyini görürmü?

2 terminal pəncərəsi açaq və paralel olaraq 2 tranzaksiya açaq.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Paralel əməliyyatlar bir-birinin məlumatlarını görür. Beləliklə, biz ən sadə, eyni zamanda ən sürətli izolyasiya səviyyəsini əldə etdik, OXUYUN UNCOMMITED.

Prinsipcə, bu, performans həmişə prioritet olan qloballar üçün gözlənilə bilər.

Qlobal əməliyyatlarda daha yüksək səviyyədə izolyasiyaya ehtiyacımız olsa nə olar?

Burada izolyasiya səviyyələrinin ümumiyyətlə niyə lazım olduğunu və necə işlədiyini düşünmək lazımdır.

Ən yüksək izolyasiya səviyyəsi, SERIALIZE, paralel olaraq həyata keçirilən əməliyyatların nəticəsinin onların ardıcıl icrasına ekvivalent olması deməkdir ki, bu da toqquşmaların olmamasına zəmanət verir.

Biz bunu ObjectScript-də bir çox fərqli istifadəyə malik ağıllı kilidlərdən istifadə etməklə edə bilərik: əmrlə müntəzəm, artımlı, çoxlu kilidləmə edə bilərsiniz. LOCK.

Aşağı izolyasiya səviyyələri verilənlər bazası sürətini artırmaq üçün nəzərdə tutulmuş güzəştlərdir.

Kilidlərdən istifadə edərək müxtəlif izolyasiya səviyyələrinə necə nail ola biləcəyimizi görək.

Bu operator yalnız məlumatları dəyişdirmək üçün lazım olan eksklüziv kilidləri deyil, oxuma prosesi zamanı digər proseslər tərəfindən dəyişdirilməməli olan məlumatları oxumaq lazım olduqda paralel olaraq bir neçə mövzu götürə bilən paylaşılan kilidləri götürməyə imkan verir.

Rus və ingilis dillərində iki fazalı bloklama üsulu haqqında ətraflı məlumat:

İki fazalı bloklama
İki fazalı kilidləmə

Çətinlik ondadır ki, əməliyyat zamanı verilənlər bazasının vəziyyəti uyğunsuz ola bilər, lakin bu uyğun olmayan məlumatlar digər proseslərə görünür. Bunun qarşısını necə almaq olar?

Kilidlərdən istifadə edərək, verilənlər bazasının vəziyyətinin ardıcıl olacağı görünmə pəncərələri yaradacağıq. Və razılaşdırılmış dövlətin belə görünmə pəncərələrinə bütün giriş kilidlər tərəfindən idarə olunacaq.

Eyni məlumatda paylaşılan kilidlər təkrar istifadə edilə bilər - bir neçə proses onları götürə bilər. Bu kilidlər digər proseslərin məlumatları dəyişdirməsinə mane olur, yəni. onlar ardıcıl verilənlər bazası vəziyyətinin pəncərələrini yaratmaq üçün istifadə olunur.

Məlumatların dəyişdirilməsi üçün eksklüziv kilidlərdən istifadə olunur - belə bir kilidi yalnız bir proses götürə bilər. Eksklüziv kilidi aşağıdakılar götürə bilər:

  1. Məlumat pulsuzdursa istənilən proses
  2. Yalnız bu məlumatda paylaşılan kilidi olan və eksklüziv kilid tələb edən ilk proses.

InterSystems IRIS qlobal sistemlərində əməliyyatlar

Görünmə pəncərəsi nə qədər dar olarsa, digər proseslər onu bir o qədər çox gözləməlidir, lakin onun daxilində verilənlər bazasının vəziyyəti bir o qədər ardıcıl ola bilər.

READ_COMMITTED — bu səviyyənin mahiyyəti ondan ibarətdir ki, biz yalnız digər mövzulardan alınan məlumatları görürük. Əgər başqa bir əməliyyatdakı məlumatlar hələ həyata keçirilməyibsə, biz onun köhnə versiyasını görürük.

Bu, kilidin açılmasını gözləmək əvəzinə işi paralelləşdirməyə imkan verir.

Xüsusi fəndlər olmadan, IRIS-də məlumatların köhnə versiyasını görə bilməyəcəyik, buna görə də kilidlərlə kifayətlənməli olacağıq.

Müvafiq olaraq, məlumatların yalnız ardıcıllıq anlarında oxunmasına icazə vermək üçün paylaşılan kilidlərdən istifadə etməli olacağıq.

Tutaq ki, bir-birinə pul köçürən bir istifadəçi bazamız var.

123-cü şəxsdən 242-ci şəxsə köçürülmə anı:

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)

Debetdən əvvəl 123-cü şəxsdən pul məbləğinin tələb edilməsi anı eksklüziv blokla müşayiət olunmalıdır (standart olaraq):

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

Şəxsi hesabınızda hesab statusunu göstərmək lazımdırsa, o zaman paylaşılan kiliddən istifadə edə və ya ümumiyyətlə istifadə edə bilməzsiniz:

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

Bununla belə, verilənlər bazası əməliyyatlarının demək olar ki, dərhal yerinə yetirildiyini fərz etsək (xatırlatmaq istərdim ki, qloballar relyasiya cədvəlindən xeyli aşağı səviyyəli strukturdur), onda bu səviyyəyə ehtiyac azalır.

TEKRAR OXUYUR - Bu təcrid səviyyəsi paralel əməliyyatlarla dəyişdirilə bilən məlumatların çoxsaylı oxunmasına imkan verir.

Müvafiq olaraq, biz dəyişdirdiyimiz məlumatların oxunmasına ortaq kilid və dəyişdirdiyimiz məlumatlara eksklüziv kilid qoymalı olacağıq.

Xoşbəxtlikdən, LOCK operatoru bir bəyanatda çox ola biləcək bütün lazımi kilidləri ətraflı şəkildə sadalamağa imkan verir.

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

digər əməliyyatlar (hazırda paralel mövzular ^person(123, məbləğ) dəyişməyə çalışır, lakin edə bilmir)

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

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

Kilidləri vergüllə ayrılmış siyahıya saldıqda, onlar ardıcıl olaraq alınır, lakin bunu etsəniz:

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

sonra hamısı bir anda atomik olaraq alınır.

SERİALİZ — biz kilidləri elə qurmalı olacağıq ki, nəticədə ümumi məlumatı olan bütün əməliyyatlar ardıcıllıqla icra olunsun. Bu yanaşma üçün, kilidlərin əksəriyyəti eksklüziv olmalı və performans üçün dünyanın ən kiçik sahələrində götürülməlidir.

Qlobal ^şəxsdə vəsaitlərin debetindən danışırıqsa, onda bunun üçün yalnız SERIALIZE izolyasiya səviyyəsi məqbuldur, çünki pul ciddi şəkildə ardıcıllıqla xərclənməlidir, əks halda eyni məbləği bir neçə dəfə xərcləmək olar.

4. Davamlılıq

Istifadə edərək qabın sərt kəsilməsi ilə sınaqlar keçirdim

docker kill my-iris

Baza onlara yaxşı dözürdü. Heç bir problem müəyyən edilmədi.

Nəticə

Qloballar üçün InterSystems IRIS əməliyyat dəstəyinə malikdir. Onlar həqiqətən atomik və etibarlıdırlar. Qloballara əsaslanan verilənlər bazasının ardıcıllığını təmin etmək üçün proqramçı səyləri və əməliyyatların istifadəsi tələb olunur, çünki onun xarici açarlar kimi mürəkkəb daxili konstruksiyaları yoxdur.

Qlobalların kilidlərdən istifadə etmədən izolyasiya səviyyəsi READ UNCOMMITED-dir və kilidlərdən istifadə edərkən SERIALIZE səviyyəsinə qədər təmin edilə bilər.

Qloballarda əməliyyatların düzgünlüyü və sürəti proqramçının bacarığından çox asılıdır: oxuyarkən daha çox paylaşılan kilidlərdən istifadə olunur, izolyasiya səviyyəsi nə qədər yüksəkdir və daha dar eksklüziv kilidlər götürülürsə, performans bir o qədər sürətli olur.

Mənbə: www.habr.com

Добавить комментарий