InterSystems IRIS DBMS ڈیٹا کو ذخیرہ کرنے کے لیے دلچسپ ڈھانچے کی حمایت کرتا ہے - گلوبل۔ بنیادی طور پر، یہ کثیر سطحی چابیاں ہیں جن میں لین دین کی شکل میں مختلف اضافی سامان موجود ہیں، ڈیٹا ٹری، تالے اور اس کی اپنی آبجیکٹ اسکرپٹ زبان کو عبور کرنے کے لیے تیز رفتار افعال۔
مضامین کی سیریز میں گلوبلز کے بارے میں مزید پڑھیں "عالمی اعداد و شمار کو ذخیرہ کرنے کے لیے خزانہ کی تلواریں ہیں":
میں اس بات میں دلچسپی لیتا ہوں کہ عالمی سطح پر لین دین کو کیسے نافذ کیا جاتا ہے، وہاں کیا خصوصیات ہیں۔ بہر حال، یہ معمول کی میزوں سے ڈیٹا کو ذخیرہ کرنے کے لیے بالکل مختلف ڈھانچہ ہے۔ بہت نچلی سطح۔
جیسا کہ تھیوری آف ریلیشنل ڈیٹا بیس سے معلوم ہوتا ہے، لین دین کا ایک اچھا نفاذ ضروریات کو پورا کرتا ہے۔ :
A - جوہری (ایٹمی)۔ لین دین میں کی گئی تمام تبدیلیاں یا کوئی بھی ریکارڈ نہیں کیا جاتا۔
C - مستقل مزاجی ٹرانزیکشن مکمل ہونے کے بعد، ڈیٹا بیس کی منطقی حالت اندرونی طور پر ایک جیسی ہونی چاہیے۔ بہت سے طریقوں سے یہ ضرورت پروگرامر سے متعلق ہے، لیکن SQL ڈیٹا بیس کے معاملے میں یہ غیر ملکی کلیدوں سے بھی متعلق ہے۔
میں - الگ تھلگ کرنا۔ متوازی طور پر چلنے والے لین دین کو ایک دوسرے پر اثر انداز نہیں ہونا چاہئے۔
D - پائیدار. لین دین کی کامیاب تکمیل کے بعد، نچلی سطح پر مسائل (مثلاً بجلی کی ناکامی) کو لین دین کے ذریعے تبدیل شدہ ڈیٹا کو متاثر نہیں کرنا چاہیے۔
گلوبلز غیر متعلقہ ڈیٹا ڈھانچے ہیں۔ انہیں انتہائی محدود ہارڈ ویئر پر تیز رفتار چلانے کے لیے ڈیزائن کیا گیا تھا۔ کا استعمال کرتے ہوئے گلوبلز میں لین دین کے نفاذ کو دیکھتے ہیں .
IRIS میں لین دین کو سپورٹ کرنے کے لیے، درج ذیل کمانڈز استعمال کیے جاتے ہیں: , , .
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. تنہائی
یہیں سے جنگلی شروع ہوتے ہیں۔ بہت سے صارفین بیک وقت ایک ہی ڈیٹا بیس پر کام کرتے ہیں، اسی ڈیٹا کو تبدیل کرتے ہیں۔
اس صورت حال کا موازنہ کیا جا سکتا ہے جب بہت سے صارفین بیک وقت ایک ہی کوڈ ریپوزٹری کے ساتھ کام کرتے ہیں اور بیک وقت کئی فائلوں میں تبدیلیاں کرنے کی کوشش کرتے ہیں۔
ڈیٹا بیس کو یہ سب کچھ اصل وقت میں ترتیب دینا چاہیے۔ اس بات پر غور کرتے ہوئے کہ سنجیدہ کمپنیوں میں ایک خاص شخص بھی ہوتا ہے جو ورژن کنٹرول (شاخوں کو ضم کرنے، تنازعات کو حل کرنے وغیرہ) کے لیے ذمہ دار ہوتا ہے، اور ڈیٹا بیس کو یہ سب کچھ حقیقی وقت میں کرنا چاہیے، کام کی پیچیدگی اور درستگی۔ ڈیٹا بیس ڈیزائن اور کوڈ جو اس کی خدمت کرتا ہے۔
ڈیٹا بیس صارفین کی طرف سے کئے گئے اقدامات کے معنی نہیں سمجھ سکتا ہے تاکہ تنازعات سے بچنے کے لیے اگر وہ ایک ہی ڈیٹا پر کام کر رہے ہوں۔ یہ صرف ایک لین دین کو کالعدم کر سکتا ہے جو دوسرے سے متصادم ہو، یا انہیں ترتیب وار انجام دے سکے۔
ایک اور مسئلہ یہ ہے کہ لین دین کے عمل کے دوران (عزم سے پہلے)، ڈیٹا بیس کی حالت متضاد ہو سکتی ہے، اس لیے یہ ضروری ہے کہ دیگر لین دین کو ڈیٹا بیس کی متضاد حالت تک رسائی حاصل نہ ہو، جو کہ متعلقہ ڈیٹا بیس میں حاصل کی جاتی ہے۔ کئی طریقوں سے: سنیپ شاٹس بنانا، ملٹی ورژن والی قطاریں وغیرہ۔
متوازی طور پر لین دین کو انجام دیتے وقت، ہمارے لیے یہ ضروری ہے کہ وہ ایک دوسرے کے ساتھ مداخلت نہ کریں۔ یہ تنہائی کی خاصیت ہے۔
ایس کیو ایل 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، کا مطلب ہے کہ متوازی طور پر انجام پانے والے لین دین کا نتیجہ ان کے ترتیب وار عمل کے برابر ہے، جو تصادم کی عدم موجودگی کی ضمانت دیتا ہے۔
ہم آبجیکٹ اسکرپٹ میں سمارٹ لاک کا استعمال کرتے ہوئے یہ کر سکتے ہیں، جس کے بہت سے مختلف استعمال ہوتے ہیں: آپ کمانڈ کے ساتھ باقاعدہ، انکریمنٹل، ایک سے زیادہ لاکنگ کر سکتے ہیں۔ .
نچلی تنہائی کی سطح ٹریڈ آف ہیں جو ڈیٹا بیس کی رفتار کو بڑھانے کے لیے ڈیزائن کی گئی ہیں۔
آئیے دیکھتے ہیں کہ ہم تالے کا استعمال کرتے ہوئے الگ تھلگ کی مختلف سطحوں کو کیسے حاصل کر سکتے ہیں۔
یہ آپریٹر آپ کو ڈیٹا کو تبدیل کرنے کے لیے درکار نہ صرف خصوصی تالے لینے کی اجازت دیتا ہے، بلکہ نام نہاد مشترکہ تالے، جو متعدد تھریڈز کو متوازی طور پر لے سکتے ہیں جب انہیں ڈیٹا کو پڑھنے کی ضرورت ہوتی ہے جسے پڑھنے کے عمل کے دوران دوسرے عمل کے ذریعے تبدیل نہیں کیا جانا چاہیے۔
روسی اور انگریزی میں دو فیز بلاک کرنے کے طریقہ کے بارے میں مزید معلومات:
→
→
مشکل یہ ہے کہ لین دین کے دوران ڈیٹا بیس کی حالت متضاد ہو سکتی ہے، لیکن یہ متضاد ڈیٹا دوسرے عمل کو نظر آتا ہے۔ اس سے کیسے بچا جائے؟
تالے کا استعمال کرتے ہوئے، ہم ویزیبلٹی ونڈو بنائیں گے جس میں ڈیٹا بیس کی حالت یکساں ہوگی۔ اور متفقہ ریاست کی مرئیت کی ایسی کھڑکیوں تک تمام رسائی کو تالے کے ذریعے کنٹرول کیا جائے گا۔
ایک ہی ڈیٹا پر مشترکہ تالے دوبارہ قابل استعمال ہیں — کئی عمل انہیں لے سکتے ہیں۔ یہ تالے دوسرے عمل کو ڈیٹا تبدیل کرنے سے روکتے ہیں، یعنی وہ مستقل ڈیٹا بیس حالت کی ونڈوز بنانے کے لیے استعمال ہوتے ہیں۔
ڈیٹا کی تبدیلی کے لیے خصوصی تالے استعمال کیے جاتے ہیں - صرف ایک عمل اس طرح کے تالے کو لے سکتا ہے۔ ایک خصوصی تالا اس کے ذریعہ لیا جاسکتا ہے:
- کوئی بھی عمل اگر ڈیٹا مفت ہے۔
- صرف وہی عمل جس میں اس ڈیٹا پر ایک مشترکہ لاک ہے اور وہ پہلا تھا جس نے خصوصی لاک کی درخواست کی۔

ویزیبلٹی ونڈو جتنی تنگ ہوتی ہے، دوسرے پروسیسز کو اس کے لیے اتنا ہی لمبا انتظار کرنا پڑتا ہے، لیکن اس کے اندر موجود ڈیٹا بیس کی حالت اتنی ہی مستقل ہو سکتی ہے۔
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)دیگر آپریشنز (اس وقت متوازی تھریڈز ^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
