هل من الممكن إطلاق قفل تلقائيا في postgresql؟
-
19-09-2019 - |
سؤال
أختبر عدم التسامح مع خطأ نظام ActiveMQ الذي تم تكوينه باسم JDBC Master / Slave. في هذا الإعداد، هناك قاعدة بيانات بعد الحوار ووسطاء - واحد هو الوسيط الرئيسي، والآخر هو وسيط الرقيق. الطريقة التي تعمل بها هذه الآلية هي سيد إخراج قفل حصري على طاولة في DB. يحاول الرقيق القيام بذلك أيضا وينتظر حتى يصبح القفل متاحا. إذا مات الماجستير، يجب إصدار القفل وسيعمل الرقيق. ومع ذلك، إذا فقد سيد تفقد اتصال الشبكة مع قاعدة البيانات، فلن يتم إصدار القفل ناتجا عن سيناريو قضائي. ما يبدو أنه مطلوب هنا هو وسيلة لإخبار Postgres بإصدار القفل تلقائيا إذا لم تتم تجديده خلال فترة زمنية محددة. يتصل بو أنماط تصميم Posa 3 بنمط التأجير. هل من الممكن الحصول على الخوارز للقيام بذلك؟ إذا لم يكن الأمر كذلك، فهل يدعمه بائعي قاعدة البيانات الأخرى؟
المحلول
هذه ليست حالة توقف تام، وهذا هو مشكلة اتصال.
يحدث حالة توقف تام عندما تحاول معاملتان قفل الموارد مؤمنة سابقا من قبل بعضها البعض. PostgreSQL
يكتشف هذه المواقف.
في حالتك، master
أقفال مورد، slave
ينتظر master
, ، و master
ينتظر إدخال المستخدم الذي لا يتلقىه أبدا لأنه يتم فقد الاتصال.
كلما PostgreSQL
يكتشف الاتصال المفقود، أنه قد استنزاد معاملتها تلقائيا.
للتحكم في الكشف عن فقدان الاتصال، يمكنك استخدام ما يلي PostgreSQL
خيارات الاتصال:
tcp_keepalives_idle (integer)
على النظم التي تدعم
TCP_KEEPIDLE
خيار المقبس، يحدد عدد الثواني بين إرسال Keepalives على اتصال الخمول خلاف ذلك. تستخدم قيمة صفر الافتراضي للنظام. لوTCP_KEEPIDLE
غير مدعوم، يجب أن تكون هذه المعلمة صفرية. يتم تجاهل هذه المعلمة للاتصالات التي تم إجراؤها عبر مقبس المجال UNIX.
tcp_keepalives_interval (integer)
على النظم التي تدعم
TCP_KEEPINTVL
خيار مأخذ المقبس، يحدد المدة، في ثوان، لانتظار الرد على keepalive قبل إعادة الإرسال. تستخدم قيمة صفر الافتراضي للنظام. لوTCP_KEEPINTVL
غير مدعوم، يجب أن تكون هذه المعلمة صفرية. يتم تجاهل هذه المعلمة للاتصالات التي تم إجراؤها عبر مقبس المجال UNIX.
tcp_keepalives_count (integer)
على النظم التي تدعم
TCP_KEEPCNT
خيار مأخذ التوصيل، يحدد عدد keepalives قد تضيع قبل النظر في الاتصال. تستخدم قيمة صفر الافتراضي للنظام. لوTCP_KEEPCNT
غير مدعوم، يجب أن تكون هذه المعلمة صفرية. يتم تجاهل هذه المعلمة للاتصالات التي تم إجراؤها عبر مقبس المجال UNIX.