Race Condition khi mua hàng giới hạn
POST · /api/practice/level4/flash-sale/buy · Nâng cao
Mô tả bài tập
Đây là bug kinh điển của các hệ thống 'flash sale': kho chỉ còn 3 sản phẩm, nhưng nếu 5-10 người bấm mua CÙNG LÚC, hệ thống xử lý không an toàn có thể bán ra nhiều hơn 3 sản phẩm vì các request đọc số lượng tồn kho gần như đồng thời, trước khi bất kỳ request nào kịp ghi lại giá trị mới. Test tuần tự (từng request một) sẽ KHÔNG BAO GIỜ phát hiện ra lỗi này - bạn bắt buộc phải gửi nhiều request đồng thời (song song) mới thấy được. Gọi POST /flash-sale/buy nhiều lần thật nhanh (5-10 request cùng lúc), sau đó GET /flash-sale/status để xem có bị bán vượt tồn kho hay không. Dùng POST /flash-sale/reset để làm lại từ đầu (kho về 3).
Mục tiêu học được
- Hiểu race condition là gì và tại sao test tuần tự không phát hiện ra được
- Biết cách tạo request đồng thời (concurrent) bằng curl chạy nền (&) hoặc script, thay vì gửi từng cái một
- Đọc hiểu kết quả tổng hợp (status endpoint) để kết luận có bug hay không, thay vì chỉ nhìn từng response riêng lẻ
💡 Postman Runner mặc định chạy tuần tự với delay=0 vẫn có thể đủ nhanh để tạo race; nếu không thấy bug, dùng curl chạy nền (&) như ví dụ trên sẽ chắc chắn hơn.
💡 Bài này hoàn thành khi bạn GET /flash-sale/status và thấy oversold=true (sold vượt quá initialStock).
Lệnh curl
# Reset kho về 3 trước khi thử
curl -s -X POST "http://testing-api.systemhub.uk/api/practice/level4/flash-sale/reset" -H "X-Practice-Token: YOUR_TOKEN"
# Bắn 8 request MUA cùng lúc (chạy nền + wait để chúng thực sự chồng lấn thời gian)
for i in $(seq 1 8); do
curl -s -X POST "http://testing-api.systemhub.uk/api/practice/level4/flash-sale/buy" -H "X-Practice-Token: YOUR_TOKEN" &
done
wait
# Xem kết quả tổng hợp - nếu sold > 3 nghĩa là đã xảy ra race condition (oversold)
curl -s "http://testing-api.systemhub.uk/api/practice/level4/flash-sale/status" -H "X-Practice-Token: YOUR_TOKEN"
Các bước làm trên Postman
- POST http://testing-api.systemhub.uk/api/practice/level4/flash-sale/reset để đưa kho về 3
- Dùng Postman Runner: chọn request POST /flash-sale/buy, đặt Iterations = 8, Delay = 0ms rồi Run - Postman sẽ bắn các request rất sát nhau
- GET http://testing-api.systemhub.uk/api/practice/level4/flash-sale/status, kiểm tra trường 'sold' - nếu sold > 3 (initialStock) tức là đã tái hiện được bug oversell
- Nếu chưa thấy oversold, reset lại và thử tăng số lượng request bắn cùng lúc
Đăng nhập để lệnh curl ở trên tự động điền sẵn Practice Token thật của bạn.
🧪 Thử nghiệm trực tiếp
Gọi API ngay tại đây. Nếu bạn đã đăng nhập, tiến độ sẽ được ghi nhận tự động khi gọi đúng như kỳ vọng của bài.
Kết quả
Status: