تقليل الجدول عن طريق مسدود في السيناريو الخاص بي مع Oracle و Innodb

StackOverflow https://stackoverflow.com/questions/3402138

سؤال

لدي 35 وظيفة تحديث من 1 إلى 3 جداول ، في معاملة. ومع ذلك ، فإنهم لا ينفذون التحديثات فحسب ، بل يقومون بالاستعلامات أيضًا.

  • الجدول 1 لا يقوم الصف بتحديث الإجراءات فقط ، وبعض الاستفسارات.
  • الجدول 2 يقوم بالاستعلامات وتحديثات مستوى الصفوف إلى الصفوف الموجودة ، وأحيانًا يحذف ويضيف صفوفًا. قد يكون لدى الجدول 2 استعلامات داخل المعاملة قبل وبعد عمليات حذف الصف و / أو الإدراج ، أو التحديثات.
  • الجدول 3 لا يتم تحديثات الصف بناءً على نتائج إجراءات الجدول 2 أعلاه.

سيكون الإجراء الأول هو التأكد من إجراء تحديثات الجدول 3 في النهاية.

الجدول 1 مستقل عن الجداول 2 الأخرى ، وربما يمكن أن يكون أولاً أو آخر. لذلك يجب أن يأتي الجدول 2 قبل تغيير الجدول 3.

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

ما يقلقني الثاني هو أن الجدول 3 هو الجدول الذي يجب أن يكون عليه خيوط Servlet. يستخدم الجدول 3 للاستعلامات ببساطة في حد ذاته. ولكن يبدو أن الأقفال على مستوى الصف ستوقف هذه الاستفسارات.

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

لا أعرف الاختلافات بين Oracle و Innodb ، لذلك لدي أسئلة هناك. (أخطط للترقية إلى أوراكل لاحقًا.)

في الأساس ، أبحث عن مؤشرات حول ما يجب الانتباه إليه. بالطبع ، يمكنني فرض قفل طاولة كامل في الجدول 2 ثم الجدول 3 في بداية كل وظيفة محدث ، ولكن بعد ذلك سيعاني سلسلة استعلام Servlet Table3. لذلك لا يبدو مثل الحل.

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

توصيات؟ أندي

قد يكون هناك تحديثات متزامنة لنفس الصفوف من الجدولين ، وقد حرصت على الوصول إلى الجداول مع التحديثات بنفس الترتيب. أحد الجداول لديه مؤشران ، ويبدو أن هناك حاجة إلى قفل الجدول لتحديث الفهرس؟ بعض الوظائف الجدول 1 ، تحديث الجدول 1 ، ثم الاستعلام اختياريا الجدول 2 ، ثم تحديث الجدول 2 ، في حلقة تكرار. يحمل هذا الجدول جميع علاقات الطفل الأصل في شجرة من جميع المحتوى الخاص بي ، لذلك يتم تحديث الحجم الكبير عبر جميع المستخدمين.

هل كانت مفيدة؟

المحلول

أولاً ، لا تأخذ الاستعلامات في Oracle (وأعتقد أن Innodb) قفلًا ما لم تستخدم للتحديث.

ثانياً ، لا أحصل على أي فكرة عن مقياس التطبيق الخاص بك. كم عدد المعاملات المتزامنة التي تتوقعها؟ هل تتوقع منهم تحديث الصفوف نفسها؟

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top