لا يتم تحديث عرض MySQL داخل المعاملة (الإسبات/الربيع)

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

سؤال

أنا أستخدم Spring for DI وHbernate للوصول إلى البيانات في قاعدة بيانات MySQL.لدي تعليمات برمجية داخل معاملة تقوم بإدراج سجل في جدول ثم تنفيذ طريقة عرض تستعلم عن هذا الجدول وتقوم ببعض العمليات الحسابية المجمعة.المشكلة التي أراها هي أن السجل الذي قمت بإدراجه للتو أثناء نفس المعاملة، لم يتم تضمينه في القيم المحسوبة لطريقة العرض.أقوم بتشغيل نفس العرض في MySQL Workbench ويتم تضمين القيمة المدرجة في العرض.هل يعرف أحد ما الذي يسبب هذا؟

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

المحلول

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

يسطب السبات يرى الجدول الأصلي وعرضه غير مرتبط تماما، عندما يكون العرض في الواقع يعتمد على الجدول ويجب جعل "قذرة" كلما تغير الجدول.لا أعرف كيفية الحصول على السبات للاعتراف بذلك.

نصائح أخرى

على الأرجح ربما لم تتحفظ التغييرات في قاعدة البيانات حتى الآن.لا يعرف السبات أن هناك اتصال بين الجدول الذي أدخلته الصفوف وعرض أنك تقرأ لاحقا.Flush EntityManager (أو جلسة أو قالب) قبل استعلام العرض.

على الأرجح يكون السبب في ذلك هو مستوى العزل الافتراضي لـ MySQL وهو REPEATABLE READ.

وهذا يعني أن معاملتك في MySQL Workbench لن تشهد تغييرات حتى تقوم بذلك نهاية تلك الصفقة.يعد تشغيل SELECT بمثابة معاملة.

من المفترض أن تشاهد التغييرات في MySQL Workbench بمجرد إصدار التزام (أو التراجع) هناك.

ربما تريد تغيير مستوى العزل الافتراضي للتثبيت الخاص بك إلى READ COMMITTED أو قم بتغيير مستوى عزل جلستك في MySQL Workbench إلى READ COMMITTED

يمكن العثور على تفاصيل حول كيفية القيام بذلك في الدليل.

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