동시성 문제
동일한 하나의 데이터에 여러 스레드가 동시에 접근하여 데이터를 동시에 제어할 때 나타나는 문제로, 하나의 세션이 데이터를 수정 중일 때, 다른 세션에서 수정 전의 데이터를 조회해 로직을 처리하면서 데이터의 정합성이 깨지는 문제 입니다.
ex. 재고, 계좌잔액 등
동시성 문제 해결하기
Synchronized
- 스레드 동기화를 위해 자바에서 지원하는 기술
- 하나의 공유자원에 동시에 접근하지 못하게 함
- 스레드간 동기화를 시켜 공유되는 데이터가 Thread-safe 하게 함
- thread-safe ?
- 멀티 스레드 프로그래밍에서 어떤 함수나 변수, 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것
public synchronized void decrease(Long id, int amount) {
/* 재고 감소 로직*/
}
Synchronized 문제점
- 하나의 프로세스 안에서만 보장됨
- 여러 서버에서 공유 자원에 접근 시 원활하게 동작하지 않을 수 있음
Database 이용
- Pessimistic Lock
- 실제 데이터에 Lock을 걸어서 정합성을 맞추는 방법
- exclusive lock을 걸게되면 다른 트랜잭션에서는 lock이 해제되기전에 데이터를 가져갈 수 없음
- 자원 요청에 따른 동시성 문제가 발생할 것이라고 예상하고 락을 걸어버리는 비관적 락 방식
- 데드락이 걸릴 수 있기 때문에 주의해서 사용해야 함
- Optimistic Lock
- 실제로 Lock을 이용하지 않고 버전을 이용해 정합성을 맞추는 방법
- 먼저 데이터를 읽은 후에 update를 수행할 때 현재 내가 읽은 버전이 맞는지 확인하며 업데이트 함
- 자원에 락을 걸어서 선점하지 않고, 동시성 문제가 발생하면 그때가서 처리하는 낙관적 락 방식
- 내가 읽은 버전에서 수정사항이 생겼을 경우 application에서 다시 읽은 후에 작업을 수행하는 롤백 작업을 수행해야 함
- Named Lock
- 이름을 가진 metadata locking
- 이름을 가진 lock을 획득 후 해제할 때 까지 다른 세션은 이 lock을 획득할 수 없음
- 트랜잭션이 종료될 때 lock이 자동으로 해제되지 않음
- 별도의 명령어로 해제를 수행하거나 선점시간이 끝나야 해제됨
Spring 동시성 문제(데이터 정합성) 뿌셔보기~
재고 시스템을 통해 동시성 문제를 알아보고, 이를 해결해보겠다. 동시성 문제란, 동일한 하나의 데이터에 2 이상의 스레드, 혹은 세션에서 가변 데이터를 동시에 제어할 때 나타는 문제로, 하나
velog.io
https://thalals.tistory.com/370
[Spring & Java] 🚀 재고시스템으로 알아보는 동시성이슈 해결방법
인프런 "재고시스템으로 알아보는 동시성 이슈 해결방법" 강의를 보고 정리한 글입니다.📗 Spring & Java, Mysql, Redis 를 이용합니다재고시스템을 활용해서, 멀티스레드 혹은 분산환경에서 가변데이
thalals.tistory.com