په InterSystems IRIS Globals کې راکړې ورکړې

په InterSystems IRIS Globals کې راکړې ورکړېد InterSystems IRIS DBMS د معلوماتو ذخیره کولو لپاره په زړه پوري جوړښتونو ملاتړ کوي - نړیوال. په لازمي ډول، دا څو اړخیزې کیلي دي چې د لیږد په بڼه کې د مختلفو اضافي سامانونو سره، د ډیټا ونو، لاکونو او د هغې د خپل آبجیکٹ سکریپټ ژبې د لیږد لپاره چټک فعالیتونه.

د مقالو په لړ کې د نړیوالو په اړه نور ولولئ "نړیوال د معلوماتو ذخیره کولو لپاره خزانه تلوارونه دي":

ونې. برخه 1
ونې. برخه 2
سپین سرې. دریمه برخه

زه لیواله شوم چې څنګه لیږدونه په نړۍ کې پلي کیږي، کوم ځانګړتیاوې شتون لري. په هرصورت، دا د معمول میزونو په پرتله د معلوماتو ذخیره کولو لپاره یو بشپړ مختلف جوړښت دی. ډیره ټیټه کچه.

لکه څنګه چې د ارتباطي ډیټابیسونو له تیوري څخه پیژندل کیږي، د معاملو ښه تطبیق باید اړتیاوې پوره کړي. اسيد:

الف – اتومي (اتومي) په راکړه ورکړه کې شوي ټول بدلونونه یا هیڅ یو هم ثبت شوي ندي.

ج – تسلسل. د لیږد بشپړیدو وروسته، د ډیټابیس منطقي حالت باید په داخلي توګه مطابقت ولري. په ډیری لارو کې دا اړتیا د پروګرام کونکي اندیښنه لري، مګر د SQL ډیټابیسونو په صورت کې دا د بهرنیو کلیدونو په اړه هم اندیښنه لري.

زه - جلا کول. په موازي ډول پرمخ وړل شوي لیږدونه باید یو بل اغیزه ونکړي.

D - دوامدار. د یوې معاملې په بریالۍ پای ته رسیدو وروسته، په ټیټو کچو کې ستونزې (د بریښنا ناکامي، د بیلګې په توګه) باید د لیږد لخوا بدل شوي ډاټا اغیزه ونکړي.

نړیوال غیر اړونده ډیټا جوړښتونه دي. دوی په خورا محدود هارډویر کې خورا ګړندي چلولو لپاره ډیزاین شوي. راځئ چې په کارولو سره په نړیوالو کې د معاملو پلي کولو ته وګورو رسمي IRIS ډاکر عکس.

په IRIS کې د معاملو مالتړ لپاره، لاندې کمانډونه کارول کیږي: TSTART, TCOMMIT, TROLLBACK.

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

موازي لیږدونه د یو بل ډاټا ګوري. نو ، موږ ترټولو ساده ، مګر د انزوا ترټولو ګړندۍ کچه هم ترلاسه کړه ، غیر منظم ولولئ.

په اصل کې، دا د نړیوالو لپاره تمه کیدی شي، د کوم لپاره چې فعالیت تل لومړیتوب لري.

څه که موږ په نړۍ کې په عملیاتو کې د لوړې کچې انزوا ته اړتیا لرو؟

دلته تاسو اړتیا لرئ د دې په اړه فکر وکړئ چې ولې د انزوا کچې ته اړتیا ده او دا څنګه کار کوي.

د انزوا لوړه کچه، SERIALIZE، پدې مانا ده چې په موازي توګه د ترسره شویو معاملو پایله د دوی د ترتیب شوي اجرا سره مساوي ده، کوم چې د ټکرونو نشتوالی تضمینوي.

موږ کولی شو دا په ObjectScript کې د سمارټ لاکونو په کارولو سره ترسره کړو، کوم چې ډیری مختلف کارونې لري: تاسو کولی شئ د کمانډ سره منظم، زیاتیدونکي، څو لاک کول ترسره کړئ. کيلي.

د انزوا ټیټه کچه د ډیټابیس سرعت زیاتولو لپاره ډیزاین شوي سوداګریز بندونه دي.

راځئ وګورو چې څنګه موږ کولی شو د تالاشۍ په کارولو سره د انزوا مختلف کچې ترلاسه کړو.

دا آپریټر تاسو ته اجازه درکوي نه یوازې ځانګړي لاکونه واخلئ چې د ډیټا بدلولو لپاره اړین دي ، بلکه ورته شریک شوي لاکونه ، کوم چې کولی شي څو تارونه په موازي ډول واخلي کله چې دوی ډیټا لوستلو ته اړتیا لري چې د لوستلو پروسې په جریان کې باید د نورو پروسو لخوا بدل نشي.

په روسي او انګلیسي کې د دوه مرحلو بلاک کولو میتود په اړه نور معلومات:

دوه مرحلې بندول
دوه مرحلې بندول

مشکل دا دی چې د لیږد په جریان کې د ډیټابیس حالت ممکن متضاد وي، مګر دا متضاد معلومات د نورو پروسو لپاره لیدل کیږي. له دې څخه څنګه مخنیوی وشي؟

د لاکونو په کارولو سره، موږ به د لید لید کړکۍ رامینځته کړو چې په کې به د ډیټابیس حالت یو شان وي. او د توافق شوي دولت د لید لید داسې کړکیو ته ټول لاسرسی به د تالاشۍ لخوا کنټرول شي.

په ورته ډیټا کې شریک شوي لاکونه د بیا کارولو وړ دي - ډیری پروسې کولی شي دوی واخلي. دا قفلونه د نورو پروسو مخه نیسي د معلوماتو بدلولو څخه، د بیلګې په توګه. دوی د ثابت ډیټابیس حالت کړکۍ جوړولو لپاره کارول کیږي.

ځانګړي قفلونه د معلوماتو بدلونونو لپاره کارول کیږي - یوازې یوه پروسه کولی شي دا ډول قفل واخلي. یو ځانګړی قفل د دې لخوا اخیستل کیدی شي:

  1. هره پروسه که معلومات وړیا وي
  2. یوازې هغه پروسه چې پدې ډیټا کې شریک قلف لري او لومړی یې و چې د ځانګړي لاک غوښتنه یې وکړه.

په InterSystems IRIS Globals کې راکړې ورکړې

څومره چې د لیدلو کړکۍ تنګ وي، په هماغه اندازه نورې پروسې باید ورته انتظار وباسي، مګر په دې کې د ډیټابیس حالت ډیر ثابت کیدی شي.

READ_COMMITTED - د دې کچې جوهر دا دی چې موږ یوازې د نورو تارونو څخه ژمن شوي ډاټا ګورو. که چیرې په بل لیږد کې ډاټا لاهم ژمنه شوې نه وي، نو بیا موږ د هغې زوړ نسخه ګورو.

دا موږ ته اجازه راکوي چې د بند خوشې کیدو ته د انتظار پرځای کار موازي کړو.

د ځانګړو چلونو پرته، موږ به ونه توانیږو چې په 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))

بیا دوی ټول په یوځل په اټومي ډول اخیستل کیږي.

سريال - موږ باید تالاشۍ تنظیم کړو ترڅو په نهایت کې ټول هغه لیږدونه چې ګډ ډیټا لري په ترتیب سره اجرا کیږي. د دې تګلارې لپاره، ډیری قلفونه باید ځانګړي وي او د فعالیت لپاره د نړۍ په کوچنیو برخو کې اخیستل کیږي.

که موږ په نړیوال شخص کې د بسپنو د ډیبیټ کولو په اړه وغږیږو، نو یوازې د سیریالیز انزوا کچه د منلو وړ ده، ځکه چې پیسې باید په کلکه په ترتیب سره ولګول شي، که نه نو دا ممکنه ده چې ورته مقدار څو ځله مصرف شي.

4. پایښت

ما د کانټینر د سخت پرې کولو سره ازموینې ترسره کړې

docker kill my-iris

اډې دوی ښه زغملی. کومه ستونزه نه ده پیژندل شوې.

پایلې

د نړیوالو لپاره، InterSystems IRIS د راکړې ورکړې ملاتړ لري. دوی واقعیا اټومي او د باور وړ دي. د نړیوالو پر بنسټ د ډیټابیس د دوام ډاډ ترلاسه کولو لپاره، د پروګرامر هڅې او د معاملو کارول اړین دي، ځکه چې دا پیچلي جوړ شوي جوړښتونه نلري لکه بهرني کیلي.

د تالاشۍ کارولو پرته د نړیوال جلا کولو کچه غیرقانوني لوستل کیږي، او کله چې د تالاشۍ په کارولو سره دا د SERIALIZE کچې پورې تضمین کیدی شي.

په نړۍ کې د راکړې ورکړې سمه او سرعت د پروګرامر په مهارت پورې اړه لري: څومره چې په پراخه کچه شریک شوي لاکونه د لوستلو په وخت کې کارول کیږي، د انزوا کچه لوړه وي، او ډیر محدود ځانګړي لاکونه اخیستل کیږي، فعالیت ګړندی کیږي.

سرچینه: www.habr.com

Add a comment