Written on 17th April 2026 by Carter Phan.
Stock = 10
1000 users click "Buy" cùng lúc
Nếu không xử lý:
Nhiều request concurrent update cùng 1 resource (inventory)
SELECT*FROM productWHERE id=1FORUPDATE;
UPDATE product
SET stock= stock-1
WHERE id=1AND version=10
SET lock:product_1 NX PX 3000
DECR stock
if stock < 0 → reject
User → request → Queue → Worker xử lý lần lượt
User request
↓
Rate limit (gateway)
↓
Redis (check stock nhanh)
↓
Push to queue
↓
Worker:
→ Deduct DB stock
→ Create order
1. User click buy
2. Redis check stock (fast reject)
3. Push request vào queue
4. Worker process:
- Deduct DB (atomic)
- Create order
5. Success / fail
| Method | Vấn đề |
| DB lock | Chậm, block |
| Redis lock | Bottleneck |
| Optimistic | Retry storm |
→ Fix: atomic counter
→ Fix: idempotency key
→ Fix: queue
→ Fix: async sync DB
| Lock type | Consistency | Scale | Use |
| DB lock | Strong | ❌ | Low traffic |
| Optimistic | Medium | ⚠️ | Medium |
| Redis lock | Medium | ⚠️ | Distributed |
| Queue | High | ✅ | Flash sale |