일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이펙티브 자바
- java
- 파이썬
- BFS
- disjoint set
- springboot
- 알고리즘
- DP
- pandas
- equals
- 다익스트라
- 문자열
- 포트앤어댑터 아키텍처
- 백준
- 위상정렬
- spring security
- dfs
- 자바
- 스프링
- dataframe
- ddd
- docker
- 데이터 flow
- series
- 헥사고날 아키텍처
- UML
- JPA
- Redis
- 세그먼트 트리
- 비트마스크
- Today
- Total
코딩못하는사람
JPA 동시성 문제 본문
동시성 문제란?
두 개 이상의 세션이 공통된 자원에 대해서 읽고 쓰는 작업을 할 때 발생할 수 있는 문제이다.
기본적으로 동시성 문제는 완전한 해결이 있는 것이 아닌 타협이 있다. 성능을 포기하고 정확성을 높이느냐, 정확성을 타협하고 성능을 높이느냐이다(ex 트랜잭션 격리 단계)
JPA에서도 JPA Transaction의 동시성을 제어하고자 하는 방법이 있다.
JPA는 객체를 조회하면 영속성 컨텍스트에 캐시하기 때문에 "일관성 없는 읽기"의 문제는 없다.
주로 해결해야 하는 문제는 "갱신 손실"이다.
갱신 손실을 해결하기 위한 두가지 방법이 있다.
Optimistic Lock(낙관적 잠금)
세션1이 데이터를 읽어 왔더라도 다른 세션인 세션2도 해당 데이터에 자유롭게 접근할 수 있다. 하지만 세션2가 Write를 하려고 할 때 세션2의 데이터와 대상 데이터가 상이하다면 저장을 할 수 없다.
낙관적 잠금을 구현하기 위해서는 @Version 어노테이션으로 공통 리소스에 대한 Versioning이 되어야 한다(세션간 값 비교를 위한).
Pessimistic Lock(비관적 잠금)
데이터베이스의 lock 기능을 사용하여 엔티티를 영속 상태로 올릴 때부터 다른 세션에서 조회하지 못하게 잠금을 건다.
Pessimistic Locking vs Optimistic Locking
Pessimistic Locking
비관적 잠금은 세션이 실패할 확률은 줄여주지만, 여러 세션의 “활동성” 은 높여주지는 못한다.
정확성이 중요한 서비스에 적합하다.
Optimistic Locking
활동성은 높일 수 있지만, 업데이트에 실패할 수 있다.
잘 진행되고 있던 프로세스가 변경 사항을 저장하려고 할 때 까지 프로세스의 성패를 예측할 수 없다.
쓰기보다 읽기 작업이 많은 서비스에 적합하다.
프로세스에서 Rollback을 마지막 단계에 알 수 있어서 중간에 외부 시스템 API를 사용하는 과정이 있다면 사용하기 어렵다.
공부한 곳
'JPA' 카테고리의 다른 글
Spring Data JPA(1) (0) | 2021.06.05 |
---|---|
JPA란? (0) | 2021.04.19 |