سؤال

لتنفيذ بلدي ، يجب أن يتم كتابة معينة بكميات كبيرة ودون فرصة للتدخل آخر.

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

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

إذا تعذر تأكيد ذلك ، فهل يجب تعيين مستوى عزل المعاملة لهذه المعاملة على SERIALIZABLE?لو ذلك, كيف يمكن أن يتم ذلك مع البيانات المعدة ليبكس?

إذا كانت المعاملات متسلسلة, ستفشل المعاملة الثانية أو سيتم وضعها في قائمة الانتظار حتى تكتمل الأولى?

إذا فشل أي منهما, كيف يمكن الكشف عن هذا مع ليبكسكس?

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

المحلول

الطريقة الوحيدة لمنع تأثيرات التزامن بشكل قاطع هي LOCK TABLE ... IN ACCESS EXCLUSIVE MODE كل جدول ترغب في تعديله.

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

لذلك عادة ، ما عليك القيام به هو معرفة ما هي بالضبط العمليات التي ترغب في القيام بها ، وكيف تتفاعل.حدد تأثيرات التزامن التي يمكنك تحملها ، وكيفية منع تلك التي لا يمكنك تحملها.

هذا السؤال كما هو واسع جدا بحيث لا يمكن الإجابة عليه بشكل مفيد.

تشمل الخيارات:

  • قفل الجداول حصريا.(هذا هو الطريقة الوحيدة أوبسيرت متعددة الصف دون مشاكل التزامن في بوستغريزل الآن).حذار من ترقية قفل وقفل النظام الجمود ذات الصلة.

  • الاستخدام المناسب ل SERIALIZABLE العزلة - ولكن تذكر ، يجب أن تكون قادرا على الاحتفاظ بسجل لما فعلته أثناء المعاملة وإعادة المحاولة إذا تم إحباط تكساس.

  • قفل دقيق على مستوى الصف - SELECT ... FOR UPDATE, SELECT ... FOR SHARE.

  • "قفل متفائل" / التحكم في التزامن المتفائل ، عند الاقتضاء

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

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