728x90

2024/11/30 3

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결. MySql lock

MySql 에서는 레코드에 락을 걸 수 있다. 이것을 X락, Exclusize Lock, 쓰기락 이라고 한다. 트랜잭션이 끝날 때 까지 읽기, 또는 쓰기를 실행 할 수 없다. X락은 중첩해서 걸 수 없다. 앞 트랜잭션이 끝날 때 까지 대기해야한다.트랜잭션이 커밋 되는 순간 락이 해제된다.  public interface CouponJpaRepository extends JpaRepository { @Lock(LockModeType.PESSIMISTIC_READ) @Query("SELECT c FROM Coupon c WHERE c.id = :id") Optional findCouponWithLock(Long id);} JpaRepository 에 락을 적용시켜준다.public class..

JAVA/프로젝트 2024.11.30

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결 redis lock, 분산락

지난 시간https://wonder-why.tistory.com/207synchronized 를 통해 동시성 문제를 해결, 쿠폰 발급 수량이 정확히 맞춰졌지만, 이 synchonized 는 자바 애플리케이션에 종속되기 때문에, 여러 서버로 확장이 된다면 락을 제대로 관리 할 수 없어진다.  이를 해결하기 위해 분산락 구현이 필요하다.  1. 설정 build.gradle에 추가한다.implementation("org.redisson:redisson-spring-boot-starter:3.16.4") RedisConfiguration 을 정의한다.package com.example.couponcore.configuration;import org.redisson.Redisson;import org.rediss..

카테고리 없음 2024.11.30

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결 synchronized

문제점: 쿠폰 발급 수량이 정확히 제어되지 않았음. 의도한 것보다 많은 수량이 발급됨원인: 동시성 문제해결 방법: 쿠폰 발급 과정에 Lock을 걸어 해결. 어떤 락을 사용할 것인가? 1.synchronized ()궁극적인 해결 방법은 되지 못한다.하지만 단일 애플리케이션을 사용하고 있기 때문에.하지만 동기화를 걸어줬을때, 쿠폰 발급이 잘 제어되는지 확인 목적차 사용.   public class CouponIssueService { private final CouponJpaRepository couponJpaRepository; private final CouponIssueJpaRepository couponIssueJpaRepository; private final CouponIssueR..

JAVA/프로젝트 2024.11.30
728x90
반응형