Ngày 16 · Transaction · Lost update
Hai phiên cùng bán một chiếc laptop
Lost update giữa hai phiên và cách khóa dòng bằng FOR UPDATE
Hai phiên cùng đọc tồn kho 5 của ASUS ROG Strix G16 rồi cùng ghi 4, nên bán 2 máy mà kho chỉ trừ 1; khi phiên A dùng SELECT FOR UPDATE, phiên B phải chờ A COMMIT, đọc được 4 rồi ghi 3.
ĐỌC RỒI GHI · READ COMMITTED
Mất một lần cập nhật
PHIÊN A
PHIÊN B
STOCK
t1
t2
t3
t4
Đọc tồn kho
SELECT … → 5
Đọc tồn kho
SELECT … → 5
Ghi 5 − 1 = 4
UPDATE … = 4; COMMIT
Ghi 5 − 1 = 4
UPDATE … = 4; COMMIT
5
5
4
4
bán 2, trừ 1
KHÓA DÒNG · SELECT … FOR UPDATE
Phiên B phải xếp hàng
PHIÊN A
PHIÊN B
STOCK
t1
t2
t3
t4
Đọc và khóa dòng
FOR UPDATE → 5
Đợi khóa của A
FOR UPDATE … chờ
Ghi 5 − 1 = 4
UPDATE … = 4; COMMIT
Nhận khóa, đọc 4
UPDATE … = 3; COMMIT
5
5
4
3
bán 2, trừ 2
vẫn chờ…
Cả hai cùng đọc 5, lần ghi sau đè lần ghi trước.
B chờ tới khi A COMMIT, rồi đọc giá trị mới.
Ví dụ: hai khách cùng mua ASUS ROG Strix G16 (product_id = 1, stock_quantity = 5)
© tiennhm