Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

그라가승훈

[유튜브-메타코딩] - 나만의 블로그 만들기 - 12. DB 격리 수준 본문

Spring

[유튜브-메타코딩] - 나만의 블로그 만들기 - 12. DB 격리 수준

그라가승훈 2022. 8. 21. 15:16
트랜잭션 : 일이 처리되기 위한 가장 작은 단위. 한꺼번에 모두 수행되어야 할 일련의 연산들.

- 오라클

read commit

  • read commit : Commit 된 것만 Read를 한다.
  • Undo 영역에 저장 된 데이터를 읽는 것이다.
  • Undo에 데이터를 저장해 두었다가 Insert, Update, Delete로 데이터를 변경해도 Commit되기 전엔 Undo 데이터는 그대로이다. Commit 하면 Undo의 데이터도 변경되고 그 데이터를 읽는 것이다.

read commit

정합성 문제

  • A가 트랜잭션 작업을 진행 중 B가 update를 commit하면 A가 작업하는 데이터에 정합성 문제가 생길 수 있다.
  • 부정합 : 트랜잭션 시작하여 종료할때 까지 Select를 했을 때 중간에 다른결과가 나오는 것.
  • PHANTOM READ : 데이터가 보였다 안보였다 하는 것. 부정합은 다른 결과가 나오는 것이고 PHANTOM READ는 결과가 없는 것이다.
  • 해결방안 : repeatable read 방식을 써야한다.


- MySQL

repeatable read

  • 부정합을 없앨 수 있다.
  • 트랜잭션 A가 수행 중 다른 사람이 update로 데이터를 변경하고 commit을 해도 A의 트랜잭션이 끝나기 전까지는 update 되기 전 데이터로 작업 수행이 가능하다.
  • 수행하는 트랜잭션 번호보다 낮은 Undo 로그를 보고 Select를 한다.

repeatable read


- 스프링에서의 정합성

  • CRUD를 할때 정합성을 위해 스프링에선 대부분 Insert, Update, Delete에만 @Transactional을 붙인다.
  • 하지만 Select를 할때에도 정합성을 위해 @Transactional을 넣어줘야 한다.

- 스프링의 트랜잭션 전략

  1. Request를 하면 web.xml과 필터에서 JDBC 커넥션 시작, 트랜잭션 시작, 영속성 컨텍스트 시작
  2. 컨트롤러가 요청을 받고 요청분기를 하여 서비스를 호출한다.
  3. 예를들어 송금 서비스일 경우 송신, 수신으로 update를 2번 실행해야 한다.
  4. JPA에서 update를 실행할때는 그냥 Select를 해서 영속성 컨텍스트에 넣는다.
  5. 영속성 컨텍스트의 있는 객체를 가져와서 객체가 들고있는 값만 바꾼다.
  6. Controller로 돌아와서 DB연결 세션 종료되고 트랜잭션과 영속성 컨텍스트가 종료된다.
  7. 트랜잭션이 종료되면 DB에서 변경 감지를 하여 flush 하면 DB값이 update 된다.
  8. Response 되면 프로그램이 종료된다.


- 스프링 JPA의 OSIV 전략

 

기본값이 True이다.

jpa.open-in-view: true
  • (예시) Player 테이블
ID Name TeamId
1 이대호 1
2 강백호 2
  • (예시) Team 테이블
ID Name Year
1 롯데 1995
2 NC 2005

Open-In-View : False (EAGER 전략만 가능)

  1. Requset 하면 영속성 컨텍스트 시작
  2. Controller에서 요청 분기로 서비스 호출
  3. 선수정보라는 서비스 호출 되면서 트랜잭션, JDBC연결 시작
  4. Repository에서 해당 정보를 Select하는데 1차캐시는 현재 비어있는 상태라 DB에서 데이터 가져온 후 영속화
  5. 영속화 된 객체를 Service로 받아오고 Controller에 return 해주는 시점에 영속성, JDBC 연결, 트랜잭션이 종료된다.
  6. 영속성 컨텍스트가 종료되므로 1차캐시에 들어간 영속화된 객체는 비영속으로 변한다.

Open-In-View : True (Lazy loading 전략도 가능, 기본값이 True이다.)

  • Service에서 JDBC연결, 트랜잭션만 종료되고 Controller에서 Response할때까지 영속성 컨텍스트는 살아있다.
  • 영속성 컨텍스트가 남아있기 때문에 Controller에서 선수테이블에서 외래키로 가지고 있는 팀 정보를 Select해서 조회할 수 있다.(Select만 가능. 값 변경은 불가.)

Comments