ماڈیول اسباق (1/4)
ACID ٹرانزیکشنز (BEGIN/COMMIT)
کسی بھی ڈیٹا بیس کے لیے اعتبار کی بنیادیں ACID مخفف پر باقی ہیں:
- A tomicity: ایک آپریشن یا تو مکمل طور پر مکمل ہو جاتا ہے (کمٹ) یا ناکام ہو جاتا ہے جس کے پیچھے کوئی آدھے کام کا نشان باقی نہیں رہتا (رول بیک)۔
- Cمستقل مزاجی: ڈیٹا بیس کے قواعد (جیسے رکاوٹیں، غیر ملکی چابیاں) کا ہمیشہ احترام کیا جاتا ہے۔
- Iسولیشن: ایک ہی وقت میں ہونے والے لین دین بے قابو طریقوں سے ایک دوسرے کے ساتھ مداخلت نہیں کرتے ہیں۔
- D استحکام: ایک کمٹ کے بعد، تبدیلی کو ناقابل واپسی طور پر ڈسک پر لکھا جاتا ہے۔
لین دین کا نحو
عام طور پر ہر ایک اپ ڈیٹ یا DELETE استفسار کو اسٹینڈ اسٹون ٹرانزیکشن (آٹوکمیٹ) سمجھا جاتا ہے۔ لیکن جب آپ متعدد کارروائیوں کو ایک ساتھ گروپ کرنا چاہتے ہیں، مثال کے طور پر گاہک کے اکاؤنٹ سے ڈیبٹ کرنا اور آرڈر دینا، تو آپ کو لین دین کی ترکیب کا استعمال کرتے ہوئے اسے واضح طور پر کرنا ہوگا۔
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesاگر ان پیچیدہ ایگزیکیوشنز کے دوران جاوا اسکرپٹ ایپ جس نے استفسار کیا تھا اسے احساس ہوتا ہے کہ کوئی مسئلہ ہے (مثال کے طور پر گودام میں کافی اسٹاک نہیں ہے اور یہ کریش ہو جاتا ہے)، یہ ایک بھیجے گا:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockخود ہی آزمائیں۔
ایک ٹرانزیکشن کھولیں۔\nآئی ڈی 10 کے ساتھ پروڈکٹ کو عارضی ٹیبل میں اس کی 'مقدار' کو 0 پر سیٹ کرتے ہوئے اپ ڈیٹ کریں (انتظار کی ضرورت نہیں، 'مقدار' پروڈکٹس پر نہیں ہے، آئیے ایجاد کرتے ہیں: 'order_items' میں 'unit_price' کو تبدیل کریں لیکن اس کے لیے ایک رکاوٹ درکار ہے۔\nآئیے بہتر کرتے ہیں: آئی ڈی 5 کو کامیابی کے ساتھ مکمل کرنے کے لیے: آرڈر کو مکمل کرنے کے لیے آئی ڈی 5 کو بہتر طریقے سے اپ ڈیٹ کریں۔
اشارہ دکھائیں۔
BEGIN; سے شروع کریں، id = 5 کے آرڈرز کو status='shipped' میں تبدیل کریں، پھر COMMIT کے ساتھ بھیجیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
پیداوار میں گھبراہٹ! ایک دیو نے WHERE کے بغیر ایک DELETE لکھا، تاریخی طور پر تمام جائزوں کو مٹا دیا۔\nآئیے انہیں دکھائیں کہ رول بیک کیسے کیا جاتا ہے۔ ایک ٹرانزیکشن شروع کریں، ایک فوری ڈیلیٹ کو فائر کریں جو 'جائزہ' سے ہر چیز کو مٹا دیتا ہے (بغیر WHERE شق کے)، لیکن پھر بلاک کو مکمل کرنے سے پہلے اثر کو کالعدم کرنے کے لیے SQL لائف سیور کا استعمال کریں۔
اشارہ دکھائیں۔
شروع کریں، 'جائزہ' پر کلین سلیٹ ڈیلیٹ، اور پھر جادوئی رول بیک؛ آخر میں
3 کوششوں کے بعد حل دستیاب ہے۔