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

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

الأقفال والتعارض الدائري والمعاملات المجهضة

نسق كاتبين وتعافَ من الخطأ دون عمل جزئي، وميز الانتظار والتعارض الدائري وفشل التسلسل وحالة المعاملة المجهضة.

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

أهداف الدرس

  • أخذ أقفال الصفوف اللازمة بترتيب ثابت.
  • شرح تنظيف 25P02 ونقاط الحفظ والإعادة الكاملة المحدودة.

لا يلغي MVCC تعارض الكتابة

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

اجعل ترتيب أقفال الحسابات صريحاً

افترض الحسابين 10 و20 في عينة مؤقتة. يجعل بحثان منفصلان ترتيب القفل التصاعدي صريحاً قبل قرار التحويل. يتحقق التطبيق من وجودهما وكفاية المصدر، ويتبع كل منافس السياسة نفسها. ينتهي المثال بالتراجع ولا يدعي أن اختيار الصفين ينفذ الصلاحية أو المال أو ثابت التحويل كاملاً.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
BEGIN;
SELECT account_id, balance FROM quay_lab.accounts
WHERE account_id = 10 FOR UPDATE;
SELECT account_id, balance FROM quay_lab.accounts
WHERE account_id = 20 FOR UPDATE;
-- Application validates both rows and the business preconditions.
ROLLBACK;

ينتظر الكاتب المتعارض ما دام القفل ممسوكاً وفق المهلة ومعالجة التعارض.

الخطأ الأول أهم من 25P02

داخل المعاملة الصريحة تجعل أخطاء كثيرة الحالة مجهضة، فتبلغ الأوامر التالية current transaction is aborted, commands ignored until end of transaction block برمز 25P02. هذه نتيجة لا الخطأ الأصلي. تراجع قبل إعادة استخدام الاتصال، وعلى المجمع إرجاع اتصال نظيف حتى لا تتسرب الحالة للطلب التالي وتخفي السبب.

استخدم نقطة حفظ لفشل محلي متوقع

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

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
BEGIN;
SAVEPOINT before_optional;
SELECT 1 / 0; -- intentional division_by_zero (22012)
ROLLBACK TO SAVEPOINT before_optional;
SELECT 1 AS usable_again;
ROLLBACK;
الناتج المتوقع
Expected sequence: division_by_zero; rollback to savepoint; usable_again = 1.

قد تتوقف أداة النص عند الخطأ المقصود؛ يصدر التطبيق التعافي بوعي.

تحتاج أنواع الفشل قرارات مختلفة

التعارض الدائري دورة انتظار فتجهض PostgreSQL طرفاً بـ 40P01. يستخدم فشل التسلسل 40001 ويحتاج إعادة القرار كاملاً. المهلة أو NOWAIT قد تعني تنافساً لا دائرة. قد تخدم SKIP LOCKED طوابير العمل وتعطي جزءاً غير متسق عمداً ولا تصلح التقرير العام. حد الإعادة واحفظ هوية الطلب وافحص المسبب بدلاً من قتل الأطول عشوائياً.

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

current transaction is aborted (25P02)

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

deadlock detected (40P01)

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

تفقد طريقة الطابور صفوف التقرير

لماذا يحدث؟
استخدمت SKIP LOCKED حين لزم تقرير كامل.
كيف تصلحه؟
اختر لقطة تقرير أو سياسة انتظار صريحة.
كيف تتجنب تكراره؟
وثق المستهلكين الذين يجوز لهم التخطي المقصود.

اختبر فهمك

1. تتبع مخالفة UNIQUE رسائل 25P02. ما السبب وما المطلوب قبل إعادة الاستخدام؟

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

مخالفة التفرد السبب و25P02 حالة لاحقة. تراجع واحفظ SQLSTATE والقيد وقرر هل الطلب مكرر أم متعارض. لا تعد العبارات اللاحقة داخل الحالة نفسها ولا ترجع الاتصال دون تنظيف.

2. تقفل A الصف 10 وتطلب 20 وتقفل B الصف 20 وتطلب 10. وضح العلاج وحده.

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

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

أهم ما تعلمته

  • تعافَ من المعاملة الفاشلة قبل استخدام اتصالها.
  • يعمل ترتيب الأقفال وقصر المدة والإعادة المحدودة معاً.

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