PostgreSQL / دليل حلول تحريري
التعافي من المعاملات المجهضة والتعارض الدائري
جد الخطأ السابق لـ 25P02 وميز الانتظار والتعارض الدائري وفشل التسلسل، وأعد الاتصال لحالة نظيفة قبل استخدامه.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
بعد فشل عبارة تظهر current transaction is aborted, commands ignored until end of transaction block (25P02). وقد تظهر deadlock detected (40P01) أو could not serialize access (40001) أو مهلة. تختلف الأسباب وسياسة الإعادة.
افهم الأسباب المحتملة
- قد يجهض خطأ قيد أو صياغة أو بيانات معاملة صريحة. الدائرة دورة انتظار وفشل التسلسل رفض تاريخ يخالف العزل. قد ينقل مجمع اتصالاً غير نظيف لطلب آخر ويخفي السبب.
احفظ الخطأ الأول وحدوده
احفظ أول SQLSTATE والقيد وهوية الطلب وحدود المعاملة من السجل. 25P02 نتيجة غالباً ولا تصلح إعادة SELECT مخالفة التفرد أو الإدخال. احجب الأسرار وحدد وجود المعاملة وتجاوز الاستثناء للتنظيف. لا ينفذ الدليل SQL فاشلة.
أنه المعاملة الفاشلة بوعي
ينفذ التطبيق ROLLBACK لوحدة العمل الفاشلة قبل إرجاع الاتصال. وإذا حمت نقطة حفظ عملية اختيارية متوقعة فيمكن ROLLBACK TO بعقد مراجع. لا تفترض حفظ العمل الجزئي نتيجة صحيحة. نظف في الاستثناء واحفظ السبب، وصمم الأثر الخارجي بعدم التكرار أو outbox.
راقب الانتظار دون إنهاء الجلسات
يفحص مشغل مصرح علاقة الحجب. تحدد pg_blocking_pids المسبب وتوفر الحالة والانتظار السياق ضمن الصلاحيات. ليست الطويلة مذنبة تلقائياً، ولا ينفي فراغ القائمة دائرة حلتها PostgreSQL بإجهاض طرف. اربط السجلات والأخطاء بالأوقات ولا تصنع تعارضاً حياً.
SELECT pid, state, wait_event_type, wait_event, xact_start,
pg_blocking_pids(pid) AS blockers
FROM pg_stat_activity
WHERE datname = current_database() AND pid <> pg_backend_pid()
ORDER BY xact_start NULLS LAST;
رصد للقراءة دون إلغاء أو إنهاء أو تغيير أقفال.
أعد القرار كاملاً ضمن حد
مع 40P01 أو 40001 القابلة للإعادة تراجع وأعد المعاملة كاملة بهوية تمنع التكرار وحد وتأخير، وأعد الحقائق. للمهلة وNOWAIT سياسة مستقلة وليستا إثبات دائرة. وحد ترتيب المفاتيح واقصر المعاملات وأبعد الشبكة والمستخدم عن القفل، ولا تضعف العزل أو التحقق لإخفاء الخطأ.
SHOW transaction_isolation;
SHOW lock_timeout;
SHOW statement_timeout;
افحص إعداد الجلسة الفعلي دون تغيير المهلة أو العزل.
تحقق من نجاح الإصلاح
اختبر معزولاً حفظ السبب والتراجع وإرجاع اتصال صالح للطلب التالي. اختبر تكراراً معروفاً لمنع مضاعفة الأثر، وتحقق من الثابت وحد المحاولات لا نجاح HTTP فقط. استخدم تزامناً اصطناعياً معتمداً لا دائرة إنتاج عرضية.
امنع تكرار المشكلة
- مركز ملكية المعاملة والتنظيف واحفظ SQLSTATE الأول وراقب العمر. وثق الترتيب وأهلية الإعادة والمفاتيح، وضيق تعافي نقاط الحفظ واختبر إعادة الاتصال بعد مسارات الخطأ.