그라가승훈
그라가승훈
« 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 |
관리 메뉴
그라가승훈
[유튜브-메타코딩] - 나만의 블로그 만들기 - 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을 넣어줘야 한다.
- 스프링의 트랜잭션 전략
- Request를 하면 web.xml과 필터에서 JDBC 커넥션 시작, 트랜잭션 시작, 영속성 컨텍스트 시작
- 컨트롤러가 요청을 받고 요청분기를 하여 서비스를 호출한다.
- 예를들어 송금 서비스일 경우 송신, 수신으로 update를 2번 실행해야 한다.
- JPA에서 update를 실행할때는 그냥 Select를 해서 영속성 컨텍스트에 넣는다.
- 영속성 컨텍스트의 있는 객체를 가져와서 객체가 들고있는 값만 바꾼다.
- Controller로 돌아와서 DB연결 세션 종료되고 트랜잭션과 영속성 컨텍스트가 종료된다.
- 트랜잭션이 종료되면 DB에서 변경 감지를 하여 flush 하면 DB값이 update 된다.
- Response 되면 프로그램이 종료된다.
- 스프링 JPA의 OSIV 전략
기본값이 True이다.
jpa.open-in-view: true
ID |
Name |
TeamId |
1 |
이대호 |
1 |
2 |
강백호 |
2 |
ID |
Name |
Year |
1 |
롯데 |
1995 |
2 |
NC |
2005 |
Open-In-View : False (EAGER 전략만 가능)
- Requset 하면 영속성 컨텍스트 시작
- Controller에서 요청 분기로 서비스 호출
- 선수정보라는 서비스 호출 되면서 트랜잭션, JDBC연결 시작
- Repository에서 해당 정보를 Select하는데 1차캐시는 현재 비어있는 상태라 DB에서 데이터 가져온 후 영속화
- 영속화 된 객체를 Service로 받아오고 Controller에 return 해주는 시점에 영속성, JDBC 연결, 트랜잭션이 종료된다.
- 영속성 컨텍스트가 종료되므로 1차캐시에 들어간 영속화된 객체는 비영속으로 변한다.
Open-In-View : True (Lazy loading 전략도 가능, 기본값이 True이다.)
- Service에서 JDBC연결, 트랜잭션만 종료되고 Controller에서 Response할때까지 영속성 컨텍스트는 살아있다.
- 영속성 컨텍스트가 남아있기 때문에 Controller에서 선수테이블에서 외래키로 가지고 있는 팀 정보를 Select해서 조회할 수 있다.(Select만 가능. 값 변경은 불가.)