Đây là 3 cách tiếp cận khác nhau:
Cập nhật nguyên tử
update table set tries=tries+1 where condition=value;
và nó sẽ được thực hiện nguyên tử.
Sử dụng giao dịch
Nếu trước tiên bạn cần chọn giá trị và cập nhật giá trị đó trong ứng dụng của mình, bạn có thể cần sử dụng các giao dịch. Điều đó có nghĩa là bạn sẽ phải sử dụng InnoDB, không phải bảng MyISAM. Truy vấn của bạn sẽ giống như sau:
BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;
nếu giao dịch không thành công, bạn có thể cần phải thử lại theo cách thủ công.
Lược đồ phiên bản
Một cách tiếp cận phổ biến là giới thiệu một cột phiên bản trong bảng của bạn. Các truy vấn của bạn sẽ tương tự như:
select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;
Nếu bản cập nhật đó không thành công / trả về 0 hàng bị ảnh hưởng, có nghĩa là ai đó đã cập nhật bảng trong thời gian trung bình. Bạn phải bắt đầu lại từ đầu - nghĩa là chọn các giá trị mới, thực hiện logic ứng dụng và thử cập nhật lại.