2013-06-13 3 views
5

Spring MVC 3.1 프로젝트에서 주석 기반 트랜잭션을 사용하고 있으며 예외가 발생하면 트랜잭션이 롤백되지 않습니다.스프링 트랜잭션이 예외 (Oracle JNDI 데이터 소스)에서 롤백되지 않습니다.

은 여기에 예외가 발생 후 그래서, 희망의 createImport 방법은 롤백해야 내 서비스 코드


@Service 
public class ImportService { 

    @Autowired 
    ImportMapper importMapper; 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    public void processImport() throws ServiceException, DatabaseException { 
     iImport import = new Import(); 

     createImport(import); 

     throw new ServiceException("");   
    } 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    private void createImport(Import import) throws DatabaseException { 
     try { 
      importMapper.createImport(eventImport); 
     } catch (Exception e) { 
      throw new DatabaseException(e); 
     } 
    } 

입니다. 그러나 불행히도 그것은 아닙니다.

내가 서버의 context.xml 내 데이터 소스를 정의하고

<Resource name="datasource.import" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:thin:@INFO" /> 

그리고 JNDI로를 찾고 있어요 :

<jee:jndi-lookup id="dataSource" jndi-name="datasource.import"/> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:annotation-driven /> 
내가 Oracle 데이터베이스를 사용하고

, 그리고 JDBC를 spec은 자동 커밋이 기본적으로 true라고 말합니다. 나는 그것을 틀리게 명시 적으로 설정하면 도움이 될 것이라고 생각했지만, 어떻게해야 하는지를 알 수 없다.

JNDI를 통해 Oracle 데이터 소스를 조회하는 동안 롤백을 작동시키는 방법이 있습니까?

+1

문제는 해결되었지만 원래 생각했던 문제는 아닙니다. 트랜잭션 Bean이 잘못된 컨텍스트 파일에 정의되었습니다. 나는 그들이 루트 컨텍스트에서 그들을했다. 이 질문은 내 문제를 해결하는 데 도움이 : http://stackoverflow.com/questions/10538345/spring-transactional-annotations-ignored –

+0

이 질문은 실제 문제는 텍스트에서 설명하는 문제는 아니므로 주제 이외의 것으로 보입니다. . – APC

답변

5

기본적으로 확인되지 않은 예외 (RuntimeException)에 대해서만 Spring의 트랜잭션 관리 롤백 트랜잭션이 처리됩니다. 체크 된 예외에 대해서도 롤백을 수행하려면이를 정의해야합니다.

When using annotations as attribute source, 당신은 (JavaDoc의에서 인용) 트랜잭션이하는 롤백의 원인이되어야 예외 클래스의 목록과 rollbackFor 속성을 제공해야합니다

/** 
* Defines zero (0) or more exception {@link Class classes}, which must be a 
* subclass of {@link Throwable}, indicating which exception types must cause 
* a transaction rollback. 
* <p>This is the preferred way to construct a rollback rule, matching the 
* exception class and subclasses. 
* <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)} 
*/ 
Class<? extends Throwable>[] rollbackFor() default {}; 
+0

정의됩니다. Transactional 주석은 rollbackFor = Throwable.class를 가진다. –

0

그것은 말했다되어있는 경우 @transational 메소드가 다른 @transational 메소드에 의해 호출되면, 첫 번째 메소드는 작동하지 않습니다. 첫 번째 @transational을 제거하고 시도해 볼 수 있습니다.

관련 문제