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

55. 트랜잭션 전파 활용 2

sdafdq 2023. 10. 17. 08:25

트랜잭션 동작에 대해 볼거임.

 

현재는

이런 상황.

그냥 트랜잭션 한 구역 다 끝내고, 다음 트랜잭션 시작해서 다 끝내는 거라

완전히 남인 트랜잭션임.

 

주황색이 트랜잭션 범위.

 

그래서

@Test
void outerTxOff_fail(){
    String username = "로그예외_outerTxOff_fail";
    memberService.joinV1(username);
    assertTrue(memberRepository.findByUsername(username).isPresent());
    assertTrue(logRepository.findByMessage(username).isPresent());
}

 

우리가 message에 "로그예외"라는 글자가 있으면 runtimeException을 날리도록 해 놨는데,

Log쪽만 예외가 터져서 rollback되고 Member는 제대로 저장 됨.

 

@Test
void outerTxOff_fail(){
    String username = "로그예외_outerTxOff_fail";
    assertThatThrownBy(()-> memberService.joinV1(username))
            .isInstanceOf(RuntimeException.class);
    assertTrue(memberRepository.findByUsername(username).isPresent());
    assertTrue(logRepository.findByMessage(username).isEmpty());
}

테스트 이렇게 바꾸면 됨.

Optional에 isPresent(), isEmpty() 다 있음.

 

 

이렇게 남남이라 상관 없음.

 

 

으음..

근데 난 아직 헷갈리는게

Member랑 Log랑 다른 DB인데,

아니 같은 DB인데 다른 테이블이라 상관이 없는건가?

 

db 종류가 h2로 같아서 상관이 없는건가?

 

뭐랄까 같이 커넥션이 묶이는 것이 잘 이해가 안되는 점이 있음.

 

그러니까, 커넥션 풀에서 같이 사용하는건가? Member커넥션이랑 Log커넥션이랑?

하긴 SQL만 좀 다르니 또 상관 없을 듯. 그렇게 보면.

 

그러면, 예를 들어서 한쪽 DB는 원래 사용하던 걸 사용하자 해서 옛날 DB이고,

한 쪽은 새롭게 만든 DB라면...

 

 

EntityManager를 쓰는데, DB가 다르면 EntityManager도 2개 주입받아야 해요?

 

예를 들면 좀 회사의 기존 서비스에서

아예 새로운 서비스말고 기존의 서비스를 활용해서 뭔가 고객에게 제공해 주고 싶다, 하면

 

기존DB랑 새로 추가 해야 할 DB랑 다를 수 있잖아요.

근데 EntityManager는 우리 눈에는 안보이지만, 자동으로 DataSource 주입 받잖아요.

DataSource가 제가 기억하기로 말 그대로 데이터의 근원, h2 이런 것 들에 대한 연결할 수 있는 정보? 들을 얻어오는 걸로 기억을 해서, DB가 다르면 저것도 다를 수 있잖아요. 또 DB의 계정마다도 다를 것 같고..

 

그러면 EntityManager가 2개 생기나요?

 

이번엔 같은 DB에 테이블만 다른거니 JPA 내부적으로 sql만 좀 다르게 짤거니까 상관 없어 보이지만..

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

57. 트랜잭션 전파 활용 4  (0) 2023.10.17
56. 트랜잭션 전파 활용 3  (0) 2023.10.17
54. 트랜잭션 전파 활용 1  (0) 2023.10.17
53. 트랜잭션 전파 6  (0) 2023.10.16
52. 트랜잭션 전파 5  (0) 2023.10.16