我有这种情况:
@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进行的回滚修改。我需要读取测试类的 mainMethod 写入的更新数据
- 我希望如果方法 2 中存在异常,则回滚只关注由方法 2() 所做的修改,而不是由测试类的 mainMethod 所做的回滚修改。我需要读取测试类的 mainMethod 写入的更新数据
如果我使用默认传播,我会到达第一个请求(可以读取 mainmethod 写入的数据)但我无法实现第二个请求:在 method1/2 中回滚回滚整个事务。
如果我使用传播 REQUIRES_NEW 我实现了第二个请求,但不是第一个。
我认为唯一的方法是使用 TransactionTemplate 使用手动事务。我的假设正确吗?