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

PostgreSQL / المتوسط: التزامن وSQL القابلة للصيانة / الدرس 7

المعاملات وMVCC والعزل

استدل على النسخ المحفوظة ووحدة العمل الذرية، واستخدم افتراض READ COMMITTED بوعي وميز استقرار اللقطة عن صحة التسلسل.

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

أهداف الدرس

  • شرح لقطات العبارات وحدود المعاملة الصريحة.
  • معالجة فشل العزل بإعادة العمل التجاري كاملاً.

ترى القراءة نسخاً تلائم اللقطة

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

شاهد تغييراتك داخل المعاملة

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

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
BEGIN;
UPDATE quay_lab.accounts SET balance = balance - 15
WHERE account_id = 10 RETURNING balance;
SELECT balance FROM quay_lab.accounts WHERE account_id = 10;
ROLLBACK;
الناتج المتوقع
Expected inside the transaction: balance = 85. After rollback: balance = 100.

تفترض القيم حساباً موجوداً ولا تغييرات أخرى في العينة المعزولة.

الافتراض لقطة لكل عبارة

افتراض PostgreSQL هو READ COMMITTED خلاف REPEATABLE READ الشائع في InnoDB. قد ترى قراءتان داخل المعاملة بيانات محفوظة مختلفة لأن لكل عبارة لقطة جديدة. يعامل READ UNCOMMITTED كـ READ COMMITTED ولا يسمح بالقراءة القذرة. افحص الإعداد الافتراضي والحالي ولا تفترض اختيار الموصل. قراءة اللقطة لا تحجز حق كتابة لاحقاً.

اطلب لقطة قراءة مستقرة صراحة

تستخدم REPEATABLE READ لقطة تبدأ بأول عبارة غير تحكمية وتثبت القراءة العادية. يقارن النمط مقياسين من اللقطة نفسها. تمنع PostgreSQL أيضاً الصفوف الشبحية هنا وقد تسمح بشذوذ التسلسل. تكشف SERIALIZABLE أنماط اعتماد خطرة وقد تجهض بـ 40001؛ ولا تعد بنجاح كل محاولة بلا انتظار أو إعادة. اختر بحسب الثابت التجاري.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY;
SELECT COUNT(*) AS bookings FROM quay_lab.bookings;
SELECT COALESCE(SUM(total), 0) AS total FROM quay_lab.bookings;
COMMIT;

تعتمد المجاميع على العينة وتشارك القراءتان لقطة مستقرة دون ادعاء أعداد مقاسة.

أعد القرار لا عبارته الأخيرة فقط

بعد فشل التسلسل تراجع وأعد المعاملة كاملة بمحاولات محدودة وتأخير مناسب. أعد قراءة المدخلات فقد يتغير القرار. نظم الأثر الخارجي بعدم التكرار أو outbox بدلاً من إعادته داخل الكتلة. لا تعود قيم nextval إلى التسلسل عند الإجهاض، وهي استثناء مهم لفهم التراجع. قد تؤخر اللقطات الطويلة التنظيف فحدد مدة للتقارير.

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

تختلف قراءتان داخل معاملة واحدة

لماذا يحدث؟
تعطي READ COMMITTED كل عبارة عادية لقطة جديدة.
كيف تصلحه؟
اختر لقطة مستقرة عندما يتطلبها التقرير.
كيف تتجنب تكراره؟
وثق العزل والحدود مع توقعات التقرير.

could not serialize access (40001)

لماذا يحدث؟
يتعارض التاريخ المتزامن مع ضمان العزل المطلوب.
كيف تصلحه؟
تراجع وأعد المعاملة كاملة ضمن حد ومنع التكرار.
كيف تتجنب تكراره؟
اختبر مخالفة الثوابت بالتزامن وإعادة المعاملة كاملة.

تظهر فجوات الهوية بعد التراجع

لماذا يحدث؟
لا يتراجع تخصيص التسلسل مع الصفوف.
كيف تصلحه؟
اقبل فجوات المفاتيح وصمم ترقيم العمل منفصلاً.
كيف تتجنب تكراره؟
لا تساوِ استمرار الأرقام بذرية المعاملة.

اختبر فهمك

1. تقرأ معاملة READ COMMITTED الرصيد ثم تحفظ أخرى تحديثاً وتقرأ الأولى ثانية. هل يلزم التطابق؟

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

لا؛ تبدأ كل SELECT بلقطة وقد ترى النسخة الجديدة. ترى المعاملة تغييراتها ولا تجمد التاريخ الآخر. اطلب REPEATABLE READ للقراءة قبل أول استعلام إذا احتاج التقرير الثبات وحدد المدة.

2. يقرأ عاملان وجود طبيب مناوب آخر ثم يخرجان معاً. لماذا لا تكفي لقطة ثابتة؟

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

قد يصح القرار محلياً وتخالف الكتابتان القاعدة بين الصفوف. استخدم بروتوكول أقفال صحيحاً أو SERIALIZABLE مع إعادة كاملة واختبر التزامن. تثبت REPEATABLE READ الملاحظة ولا تسلسل كل قرارات الصفوف المختلفة.

أهم ما تعلمته

  • تستخدم READ COMMITTED لقطات عبارات وللثبات ضمانات مختلفة.
  • فشل العزل نتيجة متوقعة تحتاج إعادة كاملة.

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