동시성
- 두 개 이상의 세션이 공통된 자원에 대해 읽고 쓰는 작업을 하는 경우, 발생할 수 있는 문제
동시성 문제의 2가지 현상
일관성 없는 읽기
- 세션 2는 동시에 실행되고 있는 세션 1 때문에, 데이터에 접근하는 시점마다 다른 값을 읽게 됩니다.
- 이러한 문제는 “불변성”, 복사본을 이용하여 해결, 세션2가 최초로 데이터를 조회하는 경우, 해당 데이터를 복사하고 이후에도 계속 사용하는 것입니다.
- 하지만, JPA에서는 영속성 컨텍스트에 데이터를 1차 캐시에 캐싱하기 때문에, 일관성 없는읽기에 대한 문제는 없습니다.
갱신 손실
- 세션2에 의해 세션 1의 변경 사항이 무시되는 현상
이러한 동시성 문제를 해결하기 위한 방안
Optimistic Lock(낙관적 락)
- 자원에 Lock을 걸지 않고 충돌이 발생했을 때, 이를 처리하는 방법
- 공통된 자원에 @version이라는 어노테이션을 추가하여 구현하고, 만약 초기에 commit한 version과 커밋할 때의 version이 다르다면 update 쿼리가 실패하게 되고 이에 대한 rollback 처리를 수행
Pessimistic Lock(비관적 락)
- DB가 제공하는 lock 기능을 이용해 엔티티를 영속 상태로 올릴 때 부터 다른 세션에서 조회하지 못하도록 Lock을 걸어두는 것
- Shared Lock(공유락, 다른 트랜잭션에서 읽기만 가능, Exclustiv Lock 적용 불가능)
- Exclusive Lock(베타락, 다른 트랜잭션에서 읽기, 쓰기 둘 다 불가능, Shard, Exclusive Lock 적용이 불가능)
오늘은 동시성 이슈와 해결 방안에 대해 간략하게 알아보았고, 다음 포스팅에서는 Java의 Synchronized, Redis의 Lettuce, Redisson, Optimistic Lock, Pessimistic Lock을 이용하여 해결하는 과정에 대해 예제 코드를 첨부하여 설명드리겠습니다.
<참고 자료>
'Java > Spring' 카테고리의 다른 글
[Spring] 계층형 디렉터리, 도메인형 디렉터리 구조 (0) | 2023.09.27 |
---|---|
[Spring] 재고 시스템으로 알아보는 동시성 이슈 해결 방법 (0) | 2023.09.19 |
[Spring] Spring AOP (0) | 2023.08.15 |
[Spring] Proxy Pattern, Decorator Pattern (0) | 2023.08.15 |
[Spring] Template Method Pattern, Strategy Pattern, Template Callback Pattern (0) | 2023.08.09 |