سؤال

لدي واحدة applicationContext.xml الملف قد اثنين org.springframework.orm.jpa.JpaTransactionManager (مع استمرار وحدة قواعد البيانات) التي تم تكوينها في الربيع الوسيطة تطبيق مخصص.

أريد أن استخدام الشرح على أساس المعاملات (@المعاملات) ، لا تعبث مع TransactionStatus ارتكاب وحفظها التراجع.

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


في التكوين الخاص بك, سيكون لديك اثنين من معاملة المديرين ؟ هل txManager1 و txManager2?

هذا ما لدي مع JPA مختلفين الربيع الفاصوليا معاملة المديرين.

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

المحلول

أعتقد أن لديك 2 الخيارات

إذا كان استخدامك الحالات لا تتطلب تحديثات كل من قواعد البيانات داخل نفس المعاملة, ثم يمكنك استخدام اثنين JpaTransactionManagers, ولكن لست متأكدا من أنك سوف تكون قادرة على استخدام @المعاملات النهج ؟ في هذه الحالة, كنت في حاجة إلى تراجع في السن آلية استخدام بسيط TransactionProxyFactoryBean تحديد معاملات الحدود ، على سبيل المثال:

<bean id="firstRealService" class="com.acme.FirstServiceImpl"/>
<bean id="firstService"  
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="firstJpaTm"/>
    <property name="target" ref="firstRealService"/>
    <property name="transactionAttributes">
        <props>
           <prop key="insert*">PROPAGATION_REQUIRED</prop>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>
<!-- similar for your second service -->

إذا كنت تتطلب معاملة تغطي كل قواعد البيانات, ثم سوف تحتاج إلى استخدام JTA إدارة المعاملات.على API الدول:

هذه الصفقة مدير مناسبة للتطبيقات التي تستخدم واحد JPA EntityManagerFactory المعاملات الوصول إلى البيانات.JTA (عادة من خلال JtaTransactionManager) ضروري من أجل الوصول إلى عدة المعاملات الموارد ضمن نفس الصفقة.ملاحظة أن تحتاج إلى تكوين JPA مزود وفقا لذلك من أجل جعله المشاركة في JTA المعاملات.

وهذا يعني أنك سوف تحتاج إلى توفير JTA إدارة المعاملات.في التطبيق لدينا ، ونحن نستخدم التكوين مشابهة لما يلي:

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManagerName" value="appserver/jndi/path" />
</bean>

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

كما لتكوين Jpa استمرار مزود أنا لست على دراية.ما JPA استمرار مزود تستخدمه ؟

رمز أعلاه يستند نهجنا ، حيث تم استخدام الأصلية السبات بدلا من السبات هو JPA التنفيذ.في هذه الحالة, كنا قادرين على التخلص من اثنين HibernateTransactionManager الفاصوليا و ببساطة ضمان أن كلا SessionFactories تم حقن مع نفس JTA TM ، ومن ثم استخدام تكساس:الشرح يحركها عنصر.

ويساعد هذا الأمل

نصائح أخرى

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

داخليا الربيع معاملة المديرين استخدام جميع الربيع TransactionSynchronizationManager التي تحافظ على مجموعة من الحالة الحرجة في ثابت ThreadLocal المتغيرات المعاملات مديري مضمونة ستومب في جميع أنحاء بعضها البعض الدولة.

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