복붙노트

[SPRING] Spring 트랜잭션 : Exception 또는 Throwable에 대한 롤백

SPRING

Spring 트랜잭션 : Exception 또는 Throwable에 대한 롤백

나는 대신에 사용하는 것이 이치에 맞는지 궁금하다.

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

Throwable를 사용하는 방법

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)

오류 잡기를 이해함에 따라 뭔가 잘못 됐을 때라도 올바르게 행동하는 데 도움이됩니다. 아니면 도움이 안 될까요?

해결법

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

    1.오류가 발생하면 스프링은 기본적으로 트랜잭션을 롤백 할 것이므로 rollbackFor = Throwable.class를 명시 적으로 지정할 필요가 없습니다.

    오류가 발생하면 스프링은 기본적으로 트랜잭션을 롤백 할 것이므로 rollbackFor = Throwable.class를 명시 적으로 지정할 필요가 없습니다.

    12.5.3 선언적 트랜잭션 롤백을 참조하십시오.

    또는 DefaultTransactionAttribute를 살펴보십시오.

    public boolean rollbackOn(Throwable ex) {
        return (ex instanceof RuntimeException || ex instanceof Error);
    }
    
  2. ==============================

    2.@Transactional을 사용하고 있으므로 Spring, Hibernate 또는 다른 JDBC 래퍼를 통해 데이터베이스 작업을하고 있다고 가정 할 수 있습니다. 이러한 JDBC 래퍼는 일반적으로 확인 된 예외를 throw하지 않으며 JDBC SQLException 유형을 래핑하는 런타임 예외를 발생시킵니다.

    @Transactional을 사용하고 있으므로 Spring, Hibernate 또는 다른 JDBC 래퍼를 통해 데이터베이스 작업을하고 있다고 가정 할 수 있습니다. 이러한 JDBC 래퍼는 일반적으로 확인 된 예외를 throw하지 않으며 JDBC SQLException 유형을 래핑하는 런타임 예외를 발생시킵니다.

    @Transactional은 검사되지 않은 예외가 발생하는 경우에만 기본적으로 롤백하도록 설정됩니다.

    다음과 같은 유스 케이스를 고려해보십시오.

    @Transactional
    public void persistAndWrite(Bean someBean) throws IOException{
        getSession().save(someBean); // DB operation
        someFileService.writeToFile(someBean); File IO operation which throws IOException
    }
    

    우리가 파일에 무엇인가 쓸 수 없기 때문에 반드시 DB 작업을 롤백하고 싶지는 않습니다.

    비슷하게

    @Transactional
    public void persistAndThrowOutOfMemory(Bean someBean)  {
        getSession().save(someBean); // DB operation
        someService.hugeOperationThrowsOutOfMemoryError(); // consumes all memory, throws OutOfMemoryError
    }
    

    일부 서비스가 너무 많은 메모리를 소비하기 때문에 저장된 엔티티를 반드시 롤백해야하는 것은 아닙니다.

    @ 거래는 당신에게 옵션을 제공합니다. 적절한 곳에서 사용하십시오.

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

    3.가능한지 아닌지는 모르겠지만 오류와 같은 Throwables를 처리하는 것은 나쁜 프로그래밍 스타일이며, 이러한 종류의 치명적인 오류를 처리하는 것은 개발자의 책임이 아닙니다. 당신이 처리 할 수없는 나쁜 일들은 언제나 발생할 수 있습니다. 필요한 경우 시스템의 일부 논리 오류와 같이 확인 된 예외를 처리해야합니다.

    가능한지 아닌지는 모르겠지만 오류와 같은 Throwables를 처리하는 것은 나쁜 프로그래밍 스타일이며, 이러한 종류의 치명적인 오류를 처리하는 것은 개발자의 책임이 아닙니다. 당신이 처리 할 수없는 나쁜 일들은 언제나 발생할 수 있습니다. 필요한 경우 시스템의 일부 논리 오류와 같이 확인 된 예외를 처리해야합니다.

  4. from https://stackoverflow.com/questions/21188239/spring-transaction-rollback-on-exception-or-throwable by cc-by-sa and MIT license