본문 바로가기
일상/회고

롤백에러 - 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이 달려있었다.. ㅠ

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

댓글