سؤال

لدي طريقة خدمة واحدة مشروحة مع Propagation.Required. ينفذ ثلاث عمليات منفصلة.

  1. أدخل إلى الجدول 1 من الجدول z إذا لم تكن هناك سجلات في الجدول 1
  2. أدخل/تحديث الجدول 1 حسب تعديل/إضافات المستخدم
  3. حذف سجلات X من الجدول 1

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

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

المحلول

نعم ، السبات connection.autocommit سيؤثر إعداد الممتلكات على حدود المعاملات.

إذا قمت بتعيين هذا على true, ، ستقوم Hibernate بوضع اتصال JDBC الأساسي في وضع Autocommit ، والذي سوف يلف كل عبارة تقوم بتنفيذها في معاملة قاعدة البيانات الخاصة بها.

لذلك ، على سبيل المثال ، في حالة فشل الاستعلام/البيان الثالث الخاص بك ، سيتم التراجع عن الاستعلام/البيان الثالث فقط.

لتنفيذ الثلاثة كوحدة واحدة ، تحتاج إلى إيقاف تشغيل وتنفيذ الثلاثة في سياق معاملة واحدة ، تصريحية أو غير ذلك.

نصائح أخرى

هل يمكنك محاولة إضافة طبقة واحدة أعلى من طبقة الخدمة وبدء المعاملة من هناك.

أنت بالتأكيد لا تريد الالتزام التلقائي. من المحتمل أن تلتزم بعد كل عملية. قم بإيقاف تشغيل AutoCommit ، وأضف التزامًا صريحًا في النهاية.

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