programing

스프링 @트라이 캐치 블록 사용 시 트랜잭션 주석

cafebook 2023. 8. 16. 22:37
반응형

스프링 @트라이 캐치 블록 사용 시 트랜잭션 주석

만약 우리가 주석이 달린 방법에서 예외를 포착한다면,@Transactional주석, 예외가 발생하면 롤백됩니까?

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void yearEndProcess() {
    try {
        // try block
    } catch (Throwable throwable) {
        // catch block
    }
}

예를들면

class A{
    
    @Transactional
    public Result doStuff(){
        Result res = null;
        try {
          // do stuff 
        } catch (Exception e) {
            
        }
        return res ;
    }
}

방법에 예외가 있는 경우doStuff트랜잭션이 롤백되지 않습니다.

To rollback the exception programmatically우리는 아래와 같은 것을 할 수 있습니다.

선언적 접근

@Transactional(rollbackFor={MyException1.class, MyException2.class, ....})
public Result doStuff(){
   ...
}

프로그램 롤백

당신은 그것을 전화할 필요가 있습니다.TransactionAspectSupport.

    public Result doStuff(){
      try {
        // business logic...
      } catch (Exception ex) {
        // trigger rollback programmatically
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      }
    }

다음을 사용하는 것이 좋습니다.declarative approach로.rollback될 수 있는 대로Programmatic rollback꼭 필요한 경우에만 사용할 수 있습니다.

스프링에서 참조 문서 작성

인터페이스에 주석을 다는 것이 아니라 @Transactional 주석을 사용하여 구체적인 클래스(및 구체적인 클래스의 메서드)에만 주석을 다는 것이 좋습니다.인터페이스(또는 인터페이스 메서드)에 @Transactional 주석을 배치할 수 있지만, 이는 인터페이스 기반 프록시를 사용하는 경우에만 사용자가 예상하는 대로 작동합니다.Java 주석이 인터페이스에서 상속되지 않는다는 것은 클래스 기반 프록시(proxy-target-class="true") 또는 위빙 기반 측면(mode="proxyj")을 사용하는 경우 트랜잭션 설정이 프록시 및 위빙 인프라에서 인식되지 않고 객체가 트랜잭션 프록시로 감싸지지 않는다는 것을 의미합니다.그것은 분명히 좋지 않을 것입니다.

프록시 모드(기본값)에서는 프록시를 통해 들어오는 외부 메서드 호출만 가로채기됩니다.즉, 대상 개체 내에서 다른 메서드를 호출하는 자체 호출은 호출된 메서드가 @Transactional로 표시되더라도 런타임에 실제 트랜잭션으로 이어지지 않습니다.

그런 다음 @Transaction의 기본 동작은 런타임입니다.예외는 롤백을 트리거하지만 선택한 예외는 롤백하지 않습니다.그러면 트랜잭션이 모든 런타임에 대해 롤백됩니다.선택한 예외 쓰기 가능에 대한 예외

당신은 이것을 읽고 싶을 것입니다.

통합 트랜잭션 관리.@Transactional 주석을 통해 또는 XML 구성 파일에서 트랜잭션 AOP 조언을 명시적으로 구성하여 선언형 AOP(Aspect-Oriental Programming) 스타일 인터셉터로 ORM 코드를 래핑할 수 있습니다.두 경우 모두 트랜잭션 의미론 및 예외 처리(롤백 등)가 처리됩니다.아래에서 설명한 것처럼 리소스 및 트랜잭션 관리에서 ORM 관련 코드에 영향을 주지 않고 다양한 트랜잭션 관리자를 스왑할 수도 있습니다.예를 들어 두 시나리오에서 모두 사용할 수 있는 동일한 전체 서비스(예: 선언형 트랜잭션)를 사용하여 로컬 트랜잭션과 JTA 간에 스왑할 수 있습니다.또한 JDBC 관련 코드는 ORM을 수행하는 데 사용하는 코드와 트랜잭션으로 완전히 통합될 수 있습니다.이 기능은 ORM 작업과 공통 트랜잭션을 공유해야 하는 배치 처리 및 BLOB 스트리밍과 같이 ORM에 적합하지 않은 데이터 액세스에 유용합니다.

@Transactional 주석에서 rollbackFor=Discoveryable.class 속성을 이미 언급했습니다.

따라서 모든 예외 트랜잭션은 롤백됩니다.

트랜잭션은 런타임 예외가 @Transactional로 주석이 달린 메서드에서 제외된 경우에만 롤백됩니다.

언급URL : https://stackoverflow.com/questions/25738883/spring-transactional-annotation-when-using-try-catch-block

반응형