Tình huống: flash sale bán vượt kho Trung cấp
Thời gian đọc ước tính: 1 phút
Ba sự cố nối tiếp nhau trong một đợt flash sale. Mỗi bước bạn chọn một cách xử lý, rồi xem ngay chuyện gì xảy ra.
- Chọn sai thì đọc giải thích rồi Chọn lại.
- Điểm chỉ tính lựa chọn đầu tiên ở mỗi bước, nên hãy nghĩ trước khi bấm.
Flash sale: 10 sản phẩm, 50 người bấm Mua
Bạn là backend dev phụ trách checkout. Mỗi lựa chọn hiển thị ngay hậu quả trên các chỉ số bên dưới.
Đơn bán vượt kho40
Request lỗi 5xx0 %
p99 checkout180 ms
Đơn trùng / trừ tiền 2 lần0
Bước 1/3 · Bán vượt kho
Kết thúc flash sale: kho có 10 sản phẩm nhưng hệ thống tạo 50 đơn. Không một dòng log lỗi. Code đã chạy trong BEGIN ... COMMIT hẳn hoi.
- stock cuối
- 9
- đơn tạo ra
- 50
- isolation
- READ COMMITTED
BEGIN; SELECT stock FROM product WHERE id = $1; -- app thấy stock = 10 -- app: if (stock >= 1) ... UPDATE product SET stock = $2 WHERE id = $1; -- $2 = stock - 1 tính trong app INSERT INTO orders ...; COMMIT;
Bạn làm gì?
Chơi xong, đọc Viết transaction trong code để xem demo đo thật cả 5 cách viết với 50 request đồng thời.