1. Mysql의 관점에서 동시성 문제 lock걸기


쿠폰 발급 로직에서 mysql관점으로 들어가보자

# 사용자1의 요청
start transaction;

# 발급된 쿠폰 개수 = 0
select * from coupons where id=1;

# 사용자1의 쿠폰을 발급한다.
/**
- update issuedQuantity
- insert coupon_issue
 */

# 트랜잭션 커밋
commit;
# 사용자2의 요청
start transaction;

# 발급된 쿠폰 개수 = 0
select * from coupons where id=1;

# 사용자2의 쿠폰을 발급한다.
/**
- update issuedQuantity
- insert coupon_issue
 */

# 트랜잭션 커밋
commit;

2. Mysql의 Xlock 사용하기


이것을 해결하기 위해 mysql의 xlock을 걸어준다. (레코드 락 걸어주기)

# 사용자1의 요청
start transaction;

# 발급된 쿠폰 개수 = 0
select * from coupons where id=1 for update;

# 사용자1의 쿠폰을 발급한다.
/**
- update issuedQuantity
- insert coupon_issue
 */

# 트랜잭션 커밋
commit;
# 사용자2의 요청
start transaction;

# 발급된 쿠폰 개수 = 1
select * from coupons where id=1 for update;

# 사용자2의 쿠폰을 발급한다.
/**
- update issuedQuantity
- insert coupon_issue
 */

# 트랜잭션 커밋
commit;