私はこの状況を持っています:
@Component @Transactional
public class Test{
public void mainMetod(){
//do some changes on db
classA.method1();
classA.method2();
}
}
@Component @Transactional
public class A{
public method1(){
//read some data from db that Test class wrote
}
public method2(){
//read some data from db that Test class wrote
}
}
および app-jpa-config.xml
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> -->
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven />
私はこの動作を実装しようとしています:
- クラス A の method1 が Test クラスの mainMetod に書かれたデータを参照できるようにしたい
- method1 に例外がある場合、ロールバックは method1() によって行われた変更のみに関心があり、Test クラスの mainMethod によって行われた変更をロールバックしないことを望みます。Test クラスの mainMethod によって書き込まれた更新されたデータを読み取る必要があります
- method2 に例外がある場合、ロールバックは method2() によって行われた変更のみに関心があり、Test クラスの mainMethod によって行われた変更をロールバックしないことを望みます。Test クラスの mainMethod によって書き込まれた更新されたデータを読み取る必要があります
デフォルトの伝播を使用すると、最初のリクエストに到達します (mainmethod によって書き込まれたデータを読み取ることができます) が、2 番目のリクエストを達成できません: method1/2 でのロールバック トランザクション全体をロールバックします。
伝搬 REQUIRES_NEW を使用すると、2 番目の要求は達成されますが、1 つは達成されません。
唯一の方法は、TransactionTemplate を使用した手動トランザクションを使用することだと思います。私の推測は正しいですか?