محتويات الدورة

MySQL / التطبيقات الموثوقة والاستعلامات التحليلية / الدرس 7

معاملات InnoDB والعزل

افهم ما يثبت معاً وما تراه اللقطة ولماذا قد يفشل نص صحيح في جلسة واحدة عند التزامن.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • عرّف الذرية والديمومة والعزل وحدود المعاملة.
  • قارن REPEATABLE READ و READ COMMITTED بتسلسل جلستين.

المعاملة حد للعملية التجارية

استخدم بيانات المتجر الأصلية مع InnoDB. قد يتطلب الشراء تغيير المخزون وإضافة طلب وبنوده. تعني الذرية تثبيت الكتابات معاً أو إلغاءها معاً. ينسق العزل المعاملات المتزامنة، وتتعلق الديمومة ببقاء النتائج المثبتة وفق ضمانات التخزين والسجلات. ولا تلغي المعاملة بريداً أو دفعة خارجية، لذلك تحتاج تلك الآثار إلى تصميم تنسيق موثوق مستقل.

تراجع عن جزء مقصود

يعطي autocommit عادة كل أمر مستقل معاملة خاصة. وتنشئ START TRANSACTION حداً صريحاً حتى COMMIT أو ROLLBACK. يمكن لنقطة الحفظ إلغاء DML اللاحقة مع إبقاء السابقة، لكنها ليست معاملة متداخلة. اعرف دائماً من يملك إنهاء المعاملة؛ فخلط معاملات الإطار مع إجراءات تثبت داخلياً قد يكسر ذرية التطبيق.

sql تراجع جزئي ثم تراجع كامل
START TRANSACTION;
UPDATE products SET stock=stock-1 WHERE id=1 AND stock>=1;
SAVEPOINT after_notebook;
UPDATE products SET stock=stock-1 WHERE id=3 AND stock>=1;
ROLLBACK TO SAVEPOINT after_notebook;
SELECT id,stock FROM products WHERE id IN (1,3) ORDER BY id;
ROLLBACK;
الناتج المتوقع
id | stock
1 | 19
3 | 5

يرى الاستعلام مخزون الدفاتر 19 والحقائب 5 لأن الخفض الثاني أُلغي. وتعيد ROLLBACK الأخيرة مخزون الدفاتر أيضاً إلى 20. لا تثبت إزالة نقطة الحفظ أوالتراجع إليها التغيير السابق.

اقرأ لقطة لا عالماً متجمداً

يعتمد InnoDB افتراضياً REPEATABLE READ. تشترك القراءات المتسقة العادية في المعاملة عادة في اللقطة التي تؤسسها أول قراءة متسقة. أما READ COMMITTED فتنشئ لقطة لكل قراءة. لا يعني أي منهما توقف الكتّاب الآخرين. وتبقى كتاباتك مرئية لك، وتستخدم القراءات القافلة الحالة الحالية وقواعد الأقفال بدلاً من إعادة اللقطة التاريخية فقط.

sql تسلسل لقطة في جلستين
-- Session A
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT stock FROM products WHERE id=1; -- 20
-- Session B, after the first read in A
START TRANSACTION;
UPDATE products SET stock=19 WHERE id=1;
COMMIT;
-- Session A, after B commits
SELECT stock FROM products WHERE id=1; -- still 20
ROLLBACK;
-- Session B: restore this disposable fixture
UPDATE products SET stock=20 WHERE id=1;
الناتج المتوقع
REPEATABLE READ: A reads 20, then 20.
READ COMMITTED variation: A reads 20, then 19.

نفذ الأوامر الموسومة فقط في مختبر مؤقت بجلستين. تبقى قراءة A الثانية 20 مع REPEATABLE READ بعد تثبيت B للقيمة 19. وعند التدريب بـ READ COMMITTED تصبح القراءة الثانية 19. الاستعادة الأخيرة كتابة مثبتة مستقلة وليست جزءاً من تراجع A.

اللقطات لا تفرض كل الثوابت

قد تقرأ جلستان السعة المتاحة وتقرران حجزها كلتاهما. استخدم UPDATE مشروطة أو قراءة قافلة مناسبة أو قيد تفرد أو آلية تسلسل صريحة. قد يزيد SERIALIZABLE الحجب والتعارضات الدائرية ولا يغني عن فهم الثابت. اختصر المعاملات ولا تنتظر مستخدماً أوخدمة بعيدة وأنت تحمل أقفال القاعدة.

عامل الفشل كانتقال حالة

يلغي التعارض الدائري عادة معاملة الضحية، أما انتهاء انتظار القفل فيلغي الأمر المنتظر افتراضياً. يجب إلغاء محاولة العمل الفاشلة صراحة، ثم إعادة وحدة كاملة آمنة من التكرار عند الملاءمة. يخلق انقطاع الاتصال أثناء COMMIT نتيجة مجهولة؛ وقد تكرر الإعادة العمياء العمل. يتيح مفتاح طلب دائم مطابقة النتيجة.

الأخطاء الشائعة وإصلاحها

لا تزيل ROLLBACK تحديثاً مستقلاً سابقاً.

لماذا يحدث؟
ثبّت autocommit الأمر قبل بدء المعاملة الصريحة.
كيف تصلحه؟
استخدم تصحيحاً مقابلاً مدققاً إن لزم وتدرّب داخل START TRANSACTION.
كيف تتجنب تكراره؟
أظهر حدود المعاملات وافحص إعدادات الاتصال.

ERROR 1568 (25001) عند تغيير العزل داخل معاملة.

لماذا يحدث؟
حاولت SET TRANSACTION تغيير الخصائص بعد بدء المعاملة.
كيف تصلحه؟
أنهِ المعاملة الحالية وحدد عزل التالية قبل بدئها.
كيف تتجنب تكراره؟
اضبط خصائص المعاملة قبل أول أمر عمل.

بيع مخزون زائد رغم القراءات المتكررة.

لماذا يحدث؟
اعتُبرت قرارات اللقطات المستقلة حجوزات حصرية.
كيف تصلحه؟
نفذ تحديثاً ذرياً مشروطاً وتحقق من الصفوف المتأثرة.
كيف تتجنب تكراره؟
صرح بالثابت وآلية فرضه عند التزامن.

اختبر فهمك

1. هل ترى A صف B المثبت حديثاً ضمن لقطة REPEATABLE READ القائمة؟

اعرض الحل المشروح

لا ترى القراءة المتسقة العادية ضمن اللقطة القائمة تثبيت B اللاحق. يؤدي إنهاء المعاملة وبدء أخرى إلى رؤية جديدة. ولا تعمم ذلك على القراءات القافلة أوكتابات A نفسها، فلها قواعد رؤية مختلفة.

2. صمم حد المعاملة لحجز المخزون وإدراج الطلب.

اعرض الحل المشروح

ابدأ معاملة واحدة واحم كل خفض موجب للمخزون، واشترط نجاح فحوص الصفوف المتأثرة، ثم أدرج الطلب وبنوده وثبت. إن فشل أي فحص أوإدراج فتراجع عن المحاولة كلها. واستخدم معرّف طلب فريداً لمطابقة الإعادات بعد تثبيت مجهول النتيجة.

أهم ما تعلمته

  • يتحكم العزل في الرؤية وتفرض القيود والكتابات المشروطة الثوابت.
  • اعرف مالك المعاملة وأعد الوحدة الكاملة الصحيحة.

المراجع الرسمية