دروس الوحدة (1/4)
معاملات ACID (البدء/الالتزام)
تعتمد أسس الموثوقية لأي قاعدة بيانات على الاختصار ACID:
- A tomicity: إما أن تكتمل العملية بالكامل (الالتزام)، أو تفشل دون ترك أي آثار نصف مكتملة (التراجع).
- Cتناسق: يتم دائمًا احترام قواعد قاعدة البيانات (مثل القيود والمفاتيح الخارجية).
- العزل: المعاملات التي تحدث في نفس الوقت لا تتداخل مع بعضها البعض بطرق خارجة عن السيطرة.
- Durability: بعد الالتزام، تتم كتابة التغيير بشكل لا رجعة فيه على القرص.
بناء جملة المعاملة
عادةً ما يتم التعامل مع كل استعلام UPDATE أو 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إذا أدرك تطبيق JavaScript الذي أرسل الاستعلام، أثناء عمليات التنفيذ المعقدة هذه، أن هناك مشكلة (على سبيل المثال، لا يوجد مخزون كافٍ في المستودع ويتعطل)، فسيرسل:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockجربه بنفسك
افتح معاملة.\nقم بتحديث المنتج بالمعرف 10 مع تعيين "الكمية" الخاصة به على 0 في الجدول المؤقت (بدون انتظار، "الكمية" ليست موجودة على المنتجات، فلنخترع: قم بتغيير "سعر الوحدة" في "order_items" ولكن ذلك يتطلب قيدًا.\nدعونا نفعل ما هو أفضل: قم بتحديث حالة معرف الطلب 5 إلى "تم الشحن" وإكمال المعاملة بنجاح.
إظهار التلميح
ابدأ بـ BEGIN، وقم بتغيير أوامر المعرف = 5 إلى الحالة = 'تم الشحن'، ثم أرسله مع COMMIT؛
الحل متاح بعد 3 من المحاولات
ذعر في الإنتاج! كتب أحد المطورين عملية "حذف" بدون "أين"، مما أدى إلى مسح كافة المراجعات تاريخيًا.\nدعونا نوضح لهم كيفية إجراء التراجع. ابدأ معاملة، وقم بإجراء عملية حذف سريعة تمسح كل شيء من "المراجعات" (بدون عبارة WHERE)، ولكن بعد ذلك استخدم منقذ SQL للتراجع عن التأثير قبل إكمال الكتلة.
إظهار التلميح
ابدأ؛، قم بحذف القائمة النظيفة على "المراجعات"، ثم التراجع السحري؛ في نهايةالمطاف.
الحل متاح بعد 3 من المحاولات