Thông thường, giải pháp cho các vấn đề đồng thời như vậy liên quan đến các giao dịch và khóa lạc quan :khi bạn cập nhật bộ đếm, hãy thêm where
để kiểm tra giá trị cũ và đếm số hàng được cập nhật.
v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x
Nếu bộ đếm đã được cập nhật trong thời gian chờ đợi, thì bản cập nhật sẽ không thay đổi bất kỳ hàng nào - vì vậy bạn biết rằng bạn phải khôi phục và thử giao dịch thêm một lần nữa.
Một vấn đề là nó có thể dẫn đến sự tranh chấp cao độ , chỉ với một vài giao dịch thành công và rất nhiều giao dịch thất bại.
Sau đó, có thể tốt hơn là bám vào khóa bi quan , nơi bạn khóa hàng trước, sau đó cập nhật hàng. Nhưng chỉ một điểm chuẩn mới cho bạn biết.
CHỈNH SỬA
Nếu bạn sử dụng giao dịch mà không có khóa lạc quan, trường hợp sau có thể xảy ra.
Max authorized = 50. Current value = 49.
T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock
Cả hai giao dịch đều thành công, giá trị là 50, nhưng có sự mâu thuẫn.