트랜잭션 동작에 대해 볼거임.
현재는
이런 상황.
그냥 트랜잭션 한 구역 다 끝내고, 다음 트랜잭션 시작해서 다 끝내는 거라
완전히 남인 트랜잭션임.
주황색이 트랜잭션 범위.
그래서
@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 |