develog

[spring boot] UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 본문

카테고리 없음

[spring boot] UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

냐옴 2023. 6. 24. 00:46

 

error

org.spr.web.ser.han.AbstractHandlerExceptionResolver(logException:208) - Resolved [org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only]

 

예외상황

- teamService.saveTeam() 을 호출한다

- teamMemberService.saveTeamMember() 를 호출한다

- teamMemberService.saveTeamMember() 에서 CustomException 예외가 발생할때 catch 하고 로깅하고 다시 throw 한다

- teamService.saveTeam() 에서 CustomException 을 catch 하고 다시 throw 하지 않는다

- 트랜잭션이 커밋될 것으로 예상되지만 트랜잭션이 롤백되면서 UnexpectedRollbackException 예외가 발생한다

 

조치

- unchecked exception (RuntimeException) 을 사용하지 말고 chcked exception (Exception) 을 사용한다

 

 

 

 

// TeamMember.java

@Slf4j
Service
@Transactional
public class TeamService {
    
    private final TeamRepository teamRepository;
    private final TeamMemberService teamMemberService;
    private final ModelMapper modalMapper;

    @Transactional
    public void saveTeam(TemMemberDto teamMemberDto) {
        try {
            TeamEntity teamEntity = modelMapper.map(teamMemberDto, TeamEntity.class);
            teamRepository.save(teamEntity);
            teamMemberService.saveTeamMember(teamMemberDto);
        } catch (CustomException e) {
            // 3. CustomException 을 catch 하고 다시 throw 하지 않는다
            log.error(e.getMessage(), e);
        }
    }
}

 

 

// TeamMemberService.java

@Slf4j
@Service
@Transactional
public class TeamMemberService {

    private final TeamMemberRepository teamMemberRepository;

    public void saveTeamMember(TemMemberDto teamMemberDto) {
        try {
            // 1. CustomException 이 발생한다
            teamMemberRepository.save(teamMemberDto);
        } catch (CustomException e) {
            // 2. CustomException 을 catch 하고 다시 throw 한다
            log.error(e.getMessage(), e);
            throw e;
        }
    }
}

 

 

// CustomException.java

public class CustomException extends RuntimesException {
    // ...
}

 

Comments