2011-02-24 3 views
8

주석 @Transactional에 문제가 있습니다.트랜잭션에서 롤백 관리

몇 가지 방법을 사용하고 있으며 내부에는 IllegalArgumentException을 던지고 잡습니다.

나는 (예외를 잡았더라도) 트랜잭션이 rollbackOnly (예외의 throw에 대한 일부 트리거)로 설정되고 트랜잭션을 커밋하지 않고 끝난다 고 생각한다.

org.springframework.transaction.TransactionSystemException : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly 

나는 @Transactional에 추가 할 수있는 노 롤백에 대한 내가 던져 잡기,하지만 난 그것이 진정한 해결책이라고 생각하지 않는 예외 : 여기

는 오류입니다.

어쩌면 당신은 내가 어떻게해야합니까 어떤 생각을해야합니까, 그래서 ...

이 거래에 rollbackOnly 설정을 해제 할 수있는 방법입니다하지만 난 그게 가장 좋은 방법은 너무하다고 생각하지 않아? 트랜잭션이 rollbackOnly하는 데 사용되는 프록시 메커니즘에 따라 설정 여부

  • :

    덕분에, IllegalArgumentException와/캐치

  • 답변

    6
    1. 봅니다 코드 냄새 (Use Exceptions only for exceptional conditions 효과적인 자바 항목 57)처럼 들린다. JDK 프록시를 사용하는 경우, 핸들러는 외부에 위치하여 메소드 호출 내에 catch 된 예외를 등록 할 방법이 없습니다. mode=aspectj을 사용하면 상황이 달라집니다. 또한 중첩 된 트랜잭션 컨텍스트가있는 경우 내부 메서드에 @Transactional(noRollbackFor=IllegalArgumentException.class)을 사용해야합니다.

    +0

    답장을 보내 주셔서 감사합니다. (필자가 제공 한 링크의 일부만 읽을 수 있음), 일반적으로 내 사례에서 예외를 사용하지 않거나 런타임 예외를 사용하지 않는 것에 대해 이야기하고 있는지 여부는 알 수 없습니다. NB : (일부 클래스에서 다른 클래스로 던져지는 오류를 경고하기 위해 예외를 사용하고 있습니다) – RoD

    +0

    @RoD 당신은 Effective Java book을 읽어야합니다. 모든 Java 개발자가 읽어야 할 책입니다. 하지만이 특정 측면을 이해하려면이 검색에서 반환 된 기사 (예외 : "flow control") (http://www.google.com/search?q=exceptions+%22flow+control%22)를 읽어보십시오. –

    2

    트랜잭션을 커밋 할 수없는 경우 코드에 예외가있을 수 있습니다. try/catch를 수행하면 전체 예외를 숨기고 간단히 섬세한 일반 설명을 얻을 수 있습니다. 롤백도 가능합니다.

    실수를 이해하고 오류에 대한 전체 설명을 보려면 try/catch 것을 삭제하고 코드를 폭발 시키십시오. 거기에서 문제의 진정한 근원을 보게 될 것입니다.