我遇到这种情况:
@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 />
我尝试实现此行为:
如果我使用默认传播,我会到达第一个请求(可以读取mainmethod写的数据),但我无法实现第二个请求:在method1 / 2回滚整个事务中回滚。
如果我使用传播REQUIRES_NEW我实现了第二个请求,但没有实现。
我认为唯一的方法是使用TransactionTemplate使用手动事务。我的假设是正确的吗?
答案 0 :(得分:0)
Hibernate不支持嵌套事务注释。所以解决我发现的问题的唯一方法是使用TransactionTemplate。
transactionTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
}
});
doInTransaction方法中的所有代码都在事务上下文中执行。因此,通过这种方式,我可以手动管理方法提交结果的确切位置。
希望这会有所帮助