스프링 트랜잭션 전파2 - 활용
:회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지되어야 함.
: 이 요구사항을 만족하기 위해서 로그와 관련된 물리 트랜잭션을 REQUIRES_NEW를 사용해서 별도로 분리.
/**
* MemberService @Transactional:ON
* MemberRepository @Transactional:ON
* LogRepository @Transactional(REQUIRES_NEW) Exception
*/
@Test
void recoverException_success() {
//given
String username = "로그예외_recoverException_success";
//when
memberService.joinV2(username); //예외를 복구하는 memberService.joinV2()를 사용
//then: member 저장, log 롤백
assertTrue(memberRepository.find(username).isPresent());
assertTrue(logRepository.find(username).isEmpty());
}
: MemberRepository 는 REQUIRED 옵션을 사용한다. 따라서 기존 트랜잭션에 참여.
: LogRepository 의 트랜잭션 옵션에 REQUIRES_NEW 를 사용.
: REQUIRES_NEW 는 항상 새로운 트랜잭션을 만들기 때문에 해당 트랜잭션 안에서는 DB 커넥션도 별도로 사용.
: 논리 트랜잭션은 하나라도 롤백되면 관련된 물리 트랜잭션은 롤백되어 버림.
: 이 문제를 해결하려면 REQUIRES_NEW 를 사용해서 트랜잭션을 분리.
'Backend' 카테고리의 다른 글
코딩자율학습단 스프링부트_2장 (0) | 2024.08.04 |
---|---|
코딩자율학습단 스프링부트_1장 (1) | 2024.08.03 |
스프링 DB 데이터 접근 활용 기술_03 (0) | 2024.01.10 |
스프링 DB 데이터 접근 활용 기술_02 (0) | 2024.01.06 |
스프링 DB 데이터 접근 활용 기술_01 (1) | 2024.01.06 |