본문 바로가기
일상/회고

롤백에러 - HeuristicCompletionException, UnexpectedRollbackException Transaction silently rolled back because it has been marked as rollback-only

by 계범 2023. 11. 8.

목차

    해당 에러로그가 남겨져있어서 원인을 파악해보았다..!

     

    UnexpectedRollbackException Transaction silently rolled back because it has been marked as rollback-only

    트랜잭션에서 트랜잭션 열었을 때, default는

    PROPAGATION_REQUIRED로 되기때문에 상위 트랜잭션에 합류된다.

     

    만약 하위 트랜잭션에서 롤백이 터지면, 상위에서 try, catch를 쓰더라도 롤백이 되게 된다.

     

    @Transactional
    public void transactionMethod1(){
    	try{
    	trasactionalService.transacationalMethod2();
        } catch(Exception ignored) {
        	
        }
    }
    
    @Trasactional
    public void transacationMethod2(){
    	throw new RuntimeException();
    }

     

    여기서 상위의 1에 아래서 2에서 터질 것을 try,catch로 감싸놔도 상위까지 롤백이 터진다.


    관련해선 우형 글에서 자세히 얘기해준다.

    https://techblog.woowahan.com/2606/

     

    응? 이게 왜 롤백되는거지? | 우아한형제들 기술블로그

    {{item.name}} 이 글은 얼마 전 에러로그 하나에 대한 호기심과 의문으로 시작해서 스프링의 트랜잭션 내에서 예외가 어떻게 처리되는지를 이해하기 위해 삽질을 해본 경험을 토대로 쓰여졌습니다.

    techblog.woowahan.com


    HeuristicCompletionException 해당 익셉션은 우리가 multiTenancy 구조이고 ChainedTransactionManager 를 쓰기때문에 상단에서 찍어준다...

     

    착각한 부분은 @Transactional 1개에서 이루어진다고 생각했는데,
    내부에서 Interface를  implements 하는 service의 일부 메서드에 @Transactional이 달려있었다.. ㅠ

    그냥 생각난김에 적어봤다!

    댓글