Bỏ qua để đến nội dung
Knowledge Hub

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.
Tình huống

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.