3つの異なるアプローチがあります:
アトミックアップデート
update table set tries=tries+1 where condition=value;
そしてそれは原子的に行われます。
トランザクションを使用する
最初に値を選択してアプリケーションで更新する必要がある場合は、トランザクションを使用する必要があります。つまり、MyISAMテーブルではなく、InnoDBを使用する必要があります。クエリは次のようになります。
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;
トランザクションが失敗した場合は、手動で再試行する必要がある場合があります。
バージョンスキーム
一般的なアプローチは、テーブルにバージョン列を導入することです。クエリは次のようになります:
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;
その更新が失敗した場合/影響を受けた0行が返される場合、他の誰かがその間にテーブルを更新しました。最初からやり直す必要があります。つまり、新しい値を選択し、アプリケーションロジックを実行して、更新を再試行する必要があります。