Stock Service mini project for resolve Java concurrency Problem Getting Started > docker run --name mariadb -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mariadb > docker exec -it mariadb > mysql -u root -p > create database stock_example; > use stock_example; 자바 동시성 이슈 여러 쓰레드가 접근 시 동시성 문제 발생 동시성 문제 해결을 위해 동기화 처리 synchronized 메소드 전체에 동기화 처리 하나의 쓰레드만 접근 가능할 수 있게 처리 public synchronized void decrease(Long quantity) { this.quantity -= quantity; } 서버가 여러대 일 경우 동시성 보장하지 못함 database lock optimistic lock lock 을 걸지않고 문제가 발생할 때 처리 version column 을 만들어 해결 실패 로직을 구현해야함 충돌이 빈번하게 일어나게 된다면 pessimistic lock 보다 더 느려짐 pessimistic lock 다른 트랜잭션이 특정 row 의 lock 을 얻는 것을 방지 특정 row 를 update 하거나 delete 할 수 있음 일반 select 는 별다른 lock 이 없기 때문에 조회 가능 named lock 이름과 함께 lock 획득. 해당 lock 은 다른 세션에서 획득 및 해제 불가 connection pool 을 다수 차지할 수 있어 다른 datasource 사용 권장 Redis lock lettuce 구현이 간단 spin lock 방식으로 redis 에 부하 발생 가능성 재시도가 필요하지 않은 경우 고려 redisson pub / sub 방식으로 구현 - redis 부하 적음 구현이 복잡 별도의 library 사용 재시도가 필요한 경우 고려