مشكلات التخزين المؤقت في استجابة MySQL مع MySQLDB في Django

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

سؤال

يمكنني استخدام MySQL مع وحدة MySQLDB في Python، في Django.

أنا أركض في وضع AutoCommit في هذه الحالة (ومعاملة Django.is_managed () فعلا إرجاع FALSE).

لدي العديد من العمليات تتفاعل مع قاعدة البيانات.

عملية واحدة يجلب جميع نماذج المهام مع Task.Objects.all ()

ثم تقوم عملية أخرى بإضافة نموذج مهمة (يمكنني رؤيته في تطبيق إدارة قواعد البيانات).

إذا قمت باستدعاء Task.Objects.all () في العملية الأولى، لا أرى أي شيء. ولكن إذا قمت باستدعاء Connection._Commit () ثم Task.Objects.all ()، أرى المهمة الجديدة.

سؤالي هو: هل هناك تخزين مؤقت مشارك عند مستوى الاتصال؟ وهل هو سلوك طبيعي (لا يبدو لي)؟

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

المحلول

هذا يبدو بالتأكيد أوتوكومات / قفل الجدول مرتبطا.

إذا أقوم MySQLDB بتنفيذ المواصفات DBAPI2، فمن المحتمل أن يكون لديك اتصال يعمل كمعاملة واحدة مستمرة واحدة. عندما تقول: 'running in autocommit mode': هل تقصد mysql نفسها أو وحدة mysqldb؟ أو django؟

لا يفسر بشكل متقطع تماما السلوك الذي تحصل عليه:

أنا) تم تطبيق اتصال كمعاملة واحدة في mysqldb (افتراضيا، ربما)

ثانيا) لا فتح / إغلاق الاتصالات فقط عند الحاجة ولكن (إعادة) باستخدام اتصالات قاعدة بيانات (أو أكثر) مستمرة (تخميني، يمكن أن يكون Django-Architecture ورثته).

ثانيا) تتسبب التحديد الخاص بك ('يقرأ') في "قفل قراءة بسيط" على جدول (مما يعني أن الاتصالات الأخرى لا تزال "قراءة" هذا الجدول ولكن الاتصالات الرغبة في "كتابة البيانات" لا يمكن (على الفور) لأن هذا القفل يمنعهم من الحصول عليها "قفل حصري" (مطلوب للكتابة ") على هذا الجدول. وهكذا تم تأجيل الكتابة إلى أجل غير مسمى (حتى تتمكن من الحصول على قفل حصري (قصير) على جدول الكتابة - عند إغلاق الاتصال أو الالتزام يدويا).

سأقوم بما يلي في قضيتك:

  • تعرف على أقفال الطاولة الموجودة في قاعدة البيانات الخاصة بك أثناء السيناريو أعلاه
  • اقرأ عن Django والمعاملات هنا. وبعد يقترح Skim سريعا باستخدام وظائف Django القياسية يسبب المراجع بشكل ضئيل. هذا يعني إرسال SQL يدويا ربما لن (إدراج وتحديث ...).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top