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