스프링/6. 스프링 DB-2

56. 트랜잭션 전파 활용 3

sdafdq 2023. 10. 17. 11:44

MemberRepository와 LogRepository를 묶는 가장 간단한 방법은 Service에서 트랜잭션 하는 것이다.

 

몇가지 경우가 있는데,

먼저 아예 MemberRepository와 LogRepository에 있던 @Transactional을 주석처리 하고,

Service에만 @Transactional을 추가해 

 

@Transactional
public void joinV1(String username){
    Member member = new Member(username);
    Log logMessage = new Log(username);

    log.info("== memberRepository 호출 시작 ==");
    memberRepository.save(member);
    log.info("== memberRepository 종료 ==");

    log.info("== logRepository 호출 시작 ==");
    logRepository.save(logMessage);
    log.info("== logRepository 종료 ==");
}

@Transactional 하나만 하는 있는 경우.

 

저 곳에만 @Transactional 있고 나머진 없음.

이렇게 되면 Service의 로직 하나를 시작부터 끝까지 트랜잭션 하나로 모두 묶을 수 있음.

 

 

트랜잭션 하면 트랜잭션 끝날때까지(commit 또는 rollback) 트랜잭션 동기화 매니저에 로컬쓰레드에 커넥션 저장해 두고, 다른 곳에서 커넥션을 얻더라도 같은 쓰레드라면 저기를 먼저 확인하기 때문에, 같은 커넥션을 쓰기 때문에,

깔끔하게 전체 트랜잭션이 된다.

 

 

 

근데,

만약 MemberRepository를 사용하는 다른 서비스나 컨트롤러가 저 MemberRepository.save()할 떄는 트랜지션을 쓰고 싶다고 한다면?

이미 save()의 @Transactional은 주석처리 했기 때문에 저건 더 이상 트랜잭션이 아니다.

 

물론, 그런 서비스나 컨트롤러에서 또 @Transactional 할 수도 있긴 하지만..

 

아무래도, 트랜잭션 전파를 이용하는 게 좋다.

이런 복잡한 상황이 있을 수도 있고.

 

여튼, 트랜잭션 전파를 사용하면,

각 옵션을 한번 정해두면 여러 방면에서 원하는 결과가 나오도록 유도할 수 있어 유용하다.

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

58. 트랜잭션 전파 활용 5  (0) 2023.10.17
57. 트랜잭션 전파 활용 4  (0) 2023.10.17
55. 트랜잭션 전파 활용 2  (0) 2023.10.17
54. 트랜잭션 전파 활용 1  (0) 2023.10.17
53. 트랜잭션 전파 6  (0) 2023.10.16