سؤال

لقد بحثت عن هذا السؤال ، هناك عدد غير قليل منهم هنا على StackOverflow و Google ولكن يبدو أنه لا يمكنني الحصول على أي شيء يعمل من أجلي.

ها هي أكوادي تكوين الربيع: (لا أستخدم أي اختصار - أعتقد أنني لست بحاجة إلى ذلك؟) Genacodicetagpre

لدي فئة خدمة: Genacodicetagpre

وفصل داو: Genacodicetagpre

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

مشكلتي مع ما ورد أعلاه هي أنه عندما أضفت سطر الاستثناء العشوائي ، فإنه لا يتراجع ، ويظل الكائن الذي يتم إصابته عبر DAO في db.

أنا أستخدم Spring 3.1 و Hibernate 3.6 (بسبب وجود خطأ في Hibernate 4.0 في Spring 3.1)

أفكار؟

شكرًا لك

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

المحلول 2

لقد اكتشفت سبب مشكلتي ولماذا لم تتم إدارة المعاملة (على ما يبدو) بشكل صحيح.

في مكان ما في الرمز الخاص بي Genacodicetagpre

الجزء الذي يقول "- بعض المنطق هنا -" ، كان هناك بعض المنطق الذي يستخدم SQL الخام ويستدعي تنفيذ التحديث: Genacodicetagpre

ونظرًا لأنه لا يستخدم استعلام Hibernate ، وبدلاً من ذلك يستخدم تنفيذ SQL خام ، فقد تسبب في استدعاء تدفق وبالتالي فإن أي عمل تم إنجازه قبل الاستدعاء سيتم الالتزام به مع عليه.

أعيد عمل تدفق المنطق لحساب هذا المنطق للتأكد من إدارة المعاملة بشكل صحيح.أثناء استخدام SQL الخام قد يكون مؤشرًا على وجود خطأ ما - كان من الضروري القيام به بسبب الأشياء التي تحاول الخدمة تحقيقها ولتحسين أداء الخدمة.

نصائح أخرى

هذا هو السلوك المقصود لإدارة المعاملات. السلوك الافتراضي لـTransactional هو الرجوع إلى الحالة السابقة فقط لاستثناءات وقت التشغيل. إذا كنت تريد إرجاع العناصر الخاصة بك إلى الحالة السابقة بعد رمي DaoException ، فقم بإضافتها إلى قائمة استثناءات التراجع.لا تنس أيضًا تضمين RuntimeException أيضًا. جرب ما يلي في صف داو Transactional (propagation= Propagation.Mandatory، rollbackFor= {RuntimeException.class، DaoException.class})

حاول إزالة التعليق التوضيحي لـTransactional من فئة DaoImpl.أظن أن ما قد يحدث هو أن المعاملة يتم تنفيذها عندما تتجاوز حدود المعاملة (DaoImpl).لقد حققت نجاحًا متباينًا مع هذا الإعداد.يمكنك تجربة بعض أساليب المعاملات المختلفة للمعاملة "الداخلية".

الشيء الآخر الذي يمكنك القيام به هو تشغيل تسجيل المعاملات الربيعي.تعتقد أن فئتها org.springframework.transaction أو شيء من هذا القبيل.بهذه الطريقة سترى بالضبط ما يفعله w.r.t للتراجع والالتزام بالمعاملات ...

ليس لديك أحد برامج تشغيل JDBC الموجودة في وضع AUTOCOMMIT افتراضيًا ، أليس كذلك؟

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