동시성은 모든 소프트웨어 시스템의 핵심적인 요구 사항이다.
이러한 동시성을 만족시킬 수 있는 소프트웨어 개발 시 겪을 수 있는 난관이 있는데, 시스템의 상태를 최신으로 유지하고 데이터베이스의 race contions(경쟁상태)나 stale state(부실 상태)를 피해야 하는 것이다.
동시성 문제란 두 개 이상의 세션이 공통된 자원에 대해서, 모두 읽고 쓰는 작업(Read -> Write)을 하려고 하는 경우 발생할 수 있는 문제를 가리킨다.
동시성 문제는 "완전한 해결"이 아닌 "적절한 해결(제어)"이다.
- "정확성"과 "활동성"을 어떻게 하면 모두 최대로 할 수 있을까"에 대한 고민
- "활동성(빠르기)"를 포기하면 정확성을 높일 수 있고, 반대로 "정확성"을 포기하면 "활동성"을 높일 수 있다.
동시성 문제를 해소하기 위한 일반적인 방법 (Pessimistic Lock, Optimistic Lock)
더 늦게 시작한 세션2에 의해 세션 1의 변경사항이 무시되는 현상을 손실되는 업테이트
라고 한다.
이러한 손실되는 업데이트를 방지하기 위한 방법에는 크게 낙관적 잠금
과 비관적 잠금
이 있다.
Pessimistic Lock(비관적 잠금)
- 데이터베이스가 제공하는 Lock 기능
- 엔티티를 영속 상태로 올릴 때부터 다른 세션에서 조회하지 못하도록 잠금을 걸어둔다.
- 만약 락을 획득한 트랜잭션이 release에 실패한다면 DB 락 발생
- DB 락을 획득할 때 timeout 설정으로 보완
- 성능상의 이슈가 있을 수 있지만, 동시적인 update가 빈번할 경우 Optimistic Lock에 비해 더 신뢰할 수 있는 작업 결과를 가질 수 있다.
- Optimistic Lock은 update를 실패할 가능성이 있음
Optimistic Lock(낙관적 잠금)
- Write(쓰기) 작업보다 Read(읽기) 작업이 더 빈번한 어플리케이션에 적합
- 공통된 자원에 대한 Version이 되어야 한다.
- 세션 2가 들고 있는 공통 자원의 Version이, 저장하려는 공통 자원은 Version과 같은지 체크가 필요
Pessimistic Locking vs Optimistic Locking
- Pessimistic Locking(비관적인 잠금)
- 공유 자원을 다수의 유저가 업데이트를 시도할 수 있는 상황
- Optimistic Locking을 사용 시 업데이트 관리가 매우 어려울 수도 있음
- Optimistic Locking 사용 시 업데이트를 실패할 가능성이 있기 떄문에, Pessimistic locking이 더 신뢰할 수 있는 결과를 제공
- 전체 프로세스 중에 Transaction 의 원자성을 보장하지 못하게 하는 “외부 시스템 연동” 같은 과정이 있을 경우
- 공유 자원을 다수의 유저가 업데이트를 시도할 수 있는 상황
- Optimistic Locking(낙관적인 잠금)
- 쓰기 작업보다 읽기 작업이 더 많은 어플리케이션에 적합
참고
https://blog.zestmoney.in/handling-concurrent-updates-with-optimistic-and-pessimistic-locking-in-jpa-c26d0b6855e7
http://jaynewho.com/post/42
'JAVA > JPA' 카테고리의 다른 글
[JPA] 성능 최적화하기_N+1 문제 (0) | 2021.11.18 |
---|---|
ManyToOne 관계와 연관관계 맵핑을 효율적으로 사용하기[기본] (0) | 2021.06.12 |
[Hibernate] @Notnull vs @ NotEmpty vs @NotBlank (0) | 2018.06.28 |