복붙노트

[SPRING] Spring 3 / Hibernate에서 트랜잭션을 롤백하기위한 베스트 프랙티스

SPRING

Spring 3 / Hibernate에서 트랜잭션을 롤백하기위한 베스트 프랙티스

Spring 문서 참조 :

javapractices.com 참조

비즈니스 로직을 수행하는 동안 문제가 발견되어 변경 사항을 롤백하려면 새로운 RuntimeException을 던져야합니다. 논리에서 식별 했으므로 RuntimeException (확인되지 ​​않은 예외)이 아닙니다. 또는 아마도 나는이 개념을 오해하고 있습니까?

내 진짜 질문, 내 트랜잭션 서비스 롤백에 대한 모범 사례는 무엇입니까?

해결법

  1. ==============================

    1.확인 된 예외를 사용하는 경우 @Transactional 주석의 rollbackFor 속성에 추가하면됩니다.

    확인 된 예외를 사용하는 경우 @Transactional 주석의 rollbackFor 속성에 추가하면됩니다.

    @Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class })
    public void method() throws MyInvalidUserException,  MyApplicationException { 
        ... 
        ... 
    }
    

    기타

    org.life.java의 대답도 잘 동작합니다. 프로그래밍 방식의 트랜잭션 관리를 선언적 트랜잭션과 혼용하거나 엄격하게 선언적으로 유지하려는 경우 학계의 결정입니다.

  2. ==============================

    2.프로그래밍 방식으로 내부에서 롤백 :

    프로그래밍 방식으로 내부에서 롤백 :

    @Transactional
    public void commit() {
      try {
        // some business logic...
      } catch (ConstraintViolationException e) {
        // trigger rollback programmatically
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      }
    }
    

    또는 롤백에 대한 예외를 표시하고 호출자로부터 처리하십시오.

    @Transactional(rollBackFor = TransactionException.class)
    public void commit() throws ConstraintViolationException{
        try {
        // some business logic...
      } catch (ConstraintViolationException e) {
        // handle the exception 
        // re-throw for rollback
        new TransactionException(e);
      }
    }
    
    public void doCommit(){
      try {
        commit()
      } catch (TransactionException e){
        // do nothing as already handled
      }
    }
    

    전 코드를 더 간단하게 유지하면서 이전 코드를 선호하지만 Spring docs에 따르면 낙심하고 있습니다.

  3. ==============================

    3.그것은 같아야한다.

    그것은 같아야한다.

    @Transactional
    public void method () throws YourCustomException  {
       try{
               //logic  
       }catch(Exception ex){
                 TransactionAspectSupport.currentTransactionStatus()
                            .setRollbackOnly();
                 throw(new YourCustomException(ex.getMessage()));
       }
    }
    
  4. ==============================

    4.예외를 확인해야한다는 의견이 다르다고 말하는 것이 안전하다고 생각합니다. 예를 들어 Spring Framework 소개에서 발췌 한 내용을 살펴 보자.

    예외를 확인해야한다는 의견이 다르다고 말하는 것이 안전하다고 생각합니다. 예를 들어 Spring Framework 소개에서 발췌 한 내용을 살펴 보자.

    데이터 액세스 예외는 분명히 프로그램의 직접적인 제어 밖에 있으므로 javapractices에 따라 검사해야합니다. 그러나 봄의 원천에있는 사람들은 다릅니다. 그리고 나는 그들의 판단을 javapractices보다 더 믿습니다.

    따라서 트랜잭션을 롤백해야 함을 나타 내기 위해 검사되지 않은 예외를 throw하는 것은 아무 문제가 없습니다. 물론 체크 된 예외를 사용할 수도 있고 애스펙트를 롤백하도록 애스펙트를 구성 할 수도 있습니다. (자세한 내용은 Affe의 답변 참조)

  5. ==============================

    5.확인 된 & 확인되지 않은 예외 처리, 트랜잭션 관리를 위해이 URL에서 왔습니다. 주석 중심 접근 방식은 아니지만 좋은 방법입니다.

    확인 된 & 확인되지 않은 예외 처리, 트랜잭션 관리를 위해이 URL에서 왔습니다. 주석 중심 접근 방식은 아니지만 좋은 방법입니다.

    http://javasight.wordpress.com/2009/02/17/understanding-spring-transaction-management-with-checked-and-unchecked-exceptions/

  6. from https://stackoverflow.com/questions/4402506/best-practices-for-rolling-back-transactions-in-spring-3-hibernate by cc-by-sa and MIT license