롤백에러 - HeuristicCompletionException, UnexpectedRollbackException Transaction silently rolled back because it has been marked as rollback-only
해당 에러로그가 남겨져있어서 원인을 파악해보았다..!
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이 달려있었다.. ㅠ
그냥 생각난김에 적어봤다!