2012-12-08 3 views
2

으로 주석 처리 된 add()이라는 서비스 메소드가 있습니다.트랜잭션 서비스에서 ConstraintViolationException에 대한 롤백이 발생하지 않았습니다.

나는 그것을 호출하지만 ConstraintViolationException이 상응하는 DAO 메소드 내에서 발생하면, 내가 지정하지 않아도 트랜잭션을 롤백 할 것이다.

나는 ConstraintViolationException이 잡힐 것이고 대신에 NotFoundException 확인 된 예외가 던져 질 것이라고 예상한다.

@Override 
@Transactional(noRollbackFor = ConstraintViolationException.class) 
public User add(User user) throws NotFoundException { 
    try { 
     result = userDao.add(user); 
    } catch (RuntimeException e) { 
     throw new NotFoundException("Couldn't find group"); 
    } 
} 

트랜잭션 롤백없이 ConstraintViolationException을 잡는 방법이 있습니까?

스프링 3.1.1 및 최대 절전 모드 3.6을 사용하고 있습니다.

+0

ConstraintViolationException에 대한 롤백이 없어야 함을 지정합니다. 그러나 Throw되는 예외는 NotFoundException입니다. 확인 된 예외이므로 기본적으로 롤백 *이 발생해서는 안됩니다. 그러나 모든 것은 Spring 트랜잭션 관리자를 어떻게 구성했는지에 달려있다. –

+0

ConstraintViolationException을 잡아서 NotFoundException을 throw하려고하지만 catch 블록이 catch를 catch하지 않습니다. catch 블록에 도달하기 전에 프록시에 의해 catch 될 수 있으므로 ConstraintViolationException이 올라가고 트랜잭션 롤백이 발생합니다. –

답변

3

아, 어떻게 될지보고 있습니다. ConstraintViolationException은 메소드가 실행 된 후 커밋 시간에 발생하여 add() 메소드의 트랜잭션 인터셉터가 트랜잭션을 커밋하려고 할 때 발생합니다. 커밋 할 수 없으므로 분명히 트랜잭션이 롤백됩니다. 그것은 다른 어떤 것도 할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. 그렇습니다. –