자바 스프링에서 트랜잭션 롤백과 관련된 문제가 있습니다.스프링 트랜잭션 관리
예 :
내 코드 (A, B, C)에서 3 개의 DAO있다. 그들 모두가 JDBCTemplate
을 확장 :
@Transaction(propagation=new_required)
public void serviceClassProc() throws Exception {
A.db1();
B.db2();
C.db3();
}
을 이제 위의 코드와 내가 B.db2()
에 예외를 던질 경우, 아무것도 롤백하지됩니다.
@Transaction(propagation=nested,rollbackon=Exception.class)
public void db2() throws Exception{
...
throw new Exception();
}
을 그리고 롤백됩니다, B.db2
으로 만 거래를 serviceClassProc()
전화 : 다음과 같은
지금은 B.db2
을 수정합니다.
serviceClassProc()
내의 모든 트랜잭션이 롤백되는 구현이 필요합니다.
<bean id="bonddao" class="com.marki.bonds.staticdata.dao.MuniStaticDataDaoImpl"> <property name="dataSource" ref="c3p0DataSource" /> </bean> <bean id="dcldao" class="com.bonds.staticdata.dao.DclSettingsDaoImpl"> <constructor-arg ref="c3p0DataSource" /> </bean> <bean id="batchlogdao" class="com.bonds.staticdata.dao.MuniFeedHandlerBatchLogDaoImpl"> <constructor-arg ref="c3p0DataSource" /> </bean>
<bean id="bondsApplication" class="com.markit.bonds.staticdata.service.MuniRefDataSyncApp"> <property name="refdataService" ref="refDataSynchService" /> <property name="mailService" ref="mailSender"></property> <property name="batchLogger" ref="batchlogdao"></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="c3p0DataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
어디 잘못 갈거야 : 여기
은 내가 사용하고있는이 개 구성입니까? 3 개의 DAO 모두 JDBC 템플릿을 확장하는 것이 잘못 되었습니까? 모두 동일한 JDBCTemplate을 공유해야합니까?
이것이 올바른지는 잘 모르겠지만 serviceClassProc 메소드에있는 @Transaction 주석에 rollbackon = Exception.class를 추가하는 것은 논리적입니다. 너 그거 해봤 니? – Kevin
LocalContainerEntityManagerFactoryBean, JdbcTemplate, TransactionManager에 대한 xml 구성을 게시하십시오 – Ralph
어떤 종류의 예외가 발생하고 있습니까? 기본적으로 Spring은 예외가'RuntimeException'을 연장하면 롤백을위한 txs를 표시 할 것임을주의하십시오. – atrain