이 상황이 있습니다.
@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을 사용하여 수동 트랜잭션을 사용하는 것입니다. 내 가정이 맞습니까?
중첩 된 트랜잭션 주석은 Hibernate에서 지원되지 않습니다. 그래서 내가 찾은 문제를 해결하는 유일한 방법은 TransactionTemplate을 사용하는 것입니다.
transactionTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
}
});
doInTransaction 메서드 내의 모든 코드는 트랜잭션 컨텍스트에서 실행됩니다. 따라서 이런 방식으로 메서드 커밋 결과를 정확히 파악할 수 있습니다.
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다