2011-11-10 4 views
2

자바 스프링에서 트랜잭션 롤백과 관련된 문제가 있습니다.스프링 트랜잭션 관리

예 :

내 코드 (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을 공유해야합니까?

+0

이것이 올바른지는 잘 모르겠지만 serviceClassProc 메소드에있는 @Transaction 주석에 rollbackon = Exception.class를 추가하는 것은 논리적입니다. 너 그거 해봤 니? – Kevin

+0

LocalContainerEntityManagerFactoryBean, JdbcTemplate, TransactionManager에 대한 xml 구성을 게시하십시오 – Ralph

+0

어떤 종류의 예외가 발생하고 있습니까? 기본적으로 Spring은 예외가'RuntimeException'을 연장하면 롤백을위한 txs를 표시 할 것임을주의하십시오. – atrain

답변

3

서비스 메소드의 주석에 rollbackon=Exception.class을 추가하고 DAO 메소드에서 트랜잭션 주석을 완전히 제거해야합니다. DAO 레벨에서 트랜잭션을 제어하는 ​​것은 나쁜 생각입니다.

+0

+1 35 초. 빨리 – Ralph

+0

rollbackon = Exception.class 시도했지만 작동하지 않았다. 어딘가에 나는 모든 3 개의 DAO가 jdbctemplate를 확장한다는 것은 3 개의 트랜잭션 모두가 고유 한 연결을 가지고 있다는 것을 의미한다고 생각합니다. 그것이 문제의 원인인지 확실하지 않습니다. – Lokesh