본문 바로가기

JAVA/JPA

[동시성] 동시성 문제 해소하기(JPA)_개념

동시성은 모든 소프트웨어 시스템의 핵심적인 요구 사항이다.
이러한 동시성을 만족시킬 수 있는 소프트웨어 개발 시 겪을 수 있는 난관이 있는데, 시스템의 상태를 최신으로 유지하고 데이터베이스의 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