Đây là hai nhận xét được chèn với cùng một content_id. Chỉ cần chèn nhận xét sẽ tạo ra một khóa CHIA SẺ trên hàng nội dung, để dừng một giao dịch khác xóa hàng đó cho đến khi giao dịch đầu tiên hoàn tất.
Tuy nhiên, trình kích hoạt sau đó tiếp tục nâng cấp khóa lên ĐỘC QUYỀN và điều này có thể bị chặn bởi một giao dịch đồng thời thực hiện cùng một quy trình. Hãy xem xét chuỗi sự kiện sau:
Txn 2754 Txn 2053
Insert Comment
Insert Comment
Lock Content#935967 SHARE
(performed by fkey)
Lock Content#935967 SHARE
(performed by fkey)
Trigger
Lock Content#935967 EXCLUSIVE
(blocks on 2053's share lock)
Trigger
Lock Content#935967 EXCLUSIVE
(blocks on 2754's share lock)
Vì vậy- bế tắc.
Một giải pháp là ngay lập tức có một khóa độc quyền trên hàng nội dung trước chèn nhận xét. tức là
SELECT 1 FROM content WHERE content.id = 935967 FOR UPDATE
INSERT INTO comment(.....)
Một giải pháp khác chỉ đơn giản là tránh hoàn toàn mẫu "số lượng được lưu trong bộ nhớ cache" này, ngoại trừ trường hợp bạn có thể chứng minh nó là cần thiết cho hiệu suất. Nếu vậy, hãy cân nhắc giữ số lượng được lưu trong bộ nhớ cache ở một nơi khác ngoài bảng nội dung-- ví dụ:một bàn dành riêng cho quầy. Điều đó cũng sẽ cắt giảm lưu lượng cập nhật vào bảng nội dung mỗi khi nhận xét được thêm vào. Hoặc có thể chỉ cần chọn lại số lượng và sử dụng memcached trong ứng dụng. Thực tế là không có gì phải bàn cãi rằng bất cứ nơi nào bạn lưu trữ số lượng được lưu trong bộ nhớ cache này sẽ là một điểm khó khăn, nó phải được cập nhật một cách an toàn.