스프링 DB 2(김영한) 강의 - 섹션 : 스프링 트랜잭션 전파1 

섹션 목적 : 트랜잭션이 둘 이상일 때 어떻게 동작하는지 알아보기

 

1. 기본

   (1) 트랜잭션이 동작하는 순서는 아래와 같다

      ① 트랜잭션 매니저로부터 트랜잭션 하나 획득(실제 DB에는 setAutoCommit(false)로 설정)

      ② 로직 실행

      ③ 트랜잭션 커밋 or 롤백

 

2. 트랜잭션 두 번 사용하기

   (1) 트랜잭션 하나 획득해서 커밋 or 롤백

      ① 커넥션 풀에서 DB와 커넥션 하나 가져와서 프록시로 감싸서 트랜잭션을 반환

      ② 로직 실행

      ③ 커밋하고 커넥션 풀에 커넥션을 반환

   (2) 트랜잭션 하나 획득해서 커밋 or 롤백

      ① 위랑 똑같이 진행. 커넥션 풀에서 가져오는 것이므로 위 트랜잭션과 실제 물리 커넥션을 같을 수 있다. 하지만 애초에 다른 트랜잭션임.

 

3. 트랜잭션 안에 트랜잭션이 있다면?

   (1) 전파 기본 옵션인 REQUIRED를 기준으로 설명

   (2) 외부 트랜잭션 안에 내부 트랜잭션이 있다면, 하나의 트랜잭션으로 진행됨

      이 때, 이렇게 두 개로 나누어진 트랜잭션을 논리 트랜잭션. 실제로 DB에 진행되는 트랜잭션은 물리 트랜잭션이라고 불림.

   (3) 원칙

      ① 모든 논리 트랜잭션 커밋 -> 물리 트랜잭션 커밋

      ② 하나라도 논리 트랜잭션 롤백 -> 물리 트랜잭션 롤백

 

4. Outer 트랜잭션 커밋, Inner 트랜잭션 커밋일 경우

   (1) Outer에서 새로운 실제 물리 트랜잭션 획득

   (2) Inner에서는 Outer에서 만들어진 트랜잭션을 위임받고, 커밋. 하지만, 이 트랜잭션은 위임받은 것이므로, 커밋하더라도 실제 물리 트랜잭션이 커밋되는 것이 아님.

   (3) Outer에서 커밋하면, Outer와 Inner 이 때 커밋됨.

 

5. Outer 롤백, Inner 커밋

   (1) Outer에서 물리 트랜잭션 획득

   (2) Inner에서 커밋하더라도 이는 실제 물리 트랜잭션의 커밋이 아님

   (3) Outer에서 롤백되면, Outer와 Inner 모두 롤백

 

6. Outer 커밋, Inner 롤백

   (1) Outer에서 물리 트랜잭션 획득

   (2) Inner에서 롤백되면, 트랜잭션에 rollback-only를 true로 변경함

   (3) Outer는 커밋할 때, rollback-only를 확인하고 true로 되어있으므로 롤백함.

      ① rollback-only가 true라는 뜻은 내부 트랜잭션 어딘가에서 rollback이 됐음을 의미.

   (4) 개발자는 커밋을 요청했는데 롤백이 됐으므로 이 현상을 알려야함. 그래서 UnexpectedRollbackException을 발생

 

7. Outer와 Inner의 트랜잭션을 분리할 수 있는 전파 옵션 : REQUIRES_NEW

   (1) Outer에서 물리 트랜잭션 획득

   (2) Inner에서도 새로운 물리 트랜잭션 획득

      ① 기존 Outer의 물리 트랜잭션은 잠시 미뤄둠

      ② 이후 Inner가 커밋 or 롤백하면, 미뤄둔 Outer 트랜잭션 시작

   (3) Outer 커밋 or 롤백

   (4) Outer와 Inner는 마치 두 개의 다른 트랜잭션을 사용하듯이 사용할 수 있음

 

8. 그 외에 기타 여러가지 전파 옵션이 존재한다.


   코테 준비

1. 프로그래머스 - 게임 맵 최단거리

- 평범한 BFS 문제. 한번에 맞추지는 못했는데, 조건을 꼼꼼하게 읽자

 

2. 프로그래머스 - 여행경로

- 시간이 남아서 한 문제 더 풀어봄. 그래프를 맵으로 표현하는 것을 떠올릴 수 있는 것이 중요.

 

3. 프로그래머스 - 아이템 줍기

- 한 문제 더. 좌표를 어떻게 표현할 것인가가 중요했던 문제. 힌트는 x2.


내일 '이펙티브 자바' 책이 오니깐, 코테 줄이고 이 책도 읽어보자

'TIL(Today I Learned)' 카테고리의 다른 글

2023.06.28  (0) 2023.06.29
2023.06.27  (0) 2023.06.27
2023.06.26  (0) 2023.06.26
2023.06.23  (0) 2023.06.23
2023.06.22  (0) 2023.06.22

+ Recent posts