sql >> データベース >  >> RDS >> Mysql

フィールドをインクリメントするときにMySQLデータベースに競合状態がないことを確認するにはどうすればよいですか?

    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行が返される場合、他の誰かがその間にテーブルを更新しました。最初からやり直す必要があります。つまり、新しい値を選択し、アプリケーションロジックを実行して、更新を再試行する必要があります。



    1. PLSQLのGotoLabelコマンドを使用して特定の行に制御を渡す

    2. MySQLでBLOBをVARCHARに変換するにはどうすればよいですか?

    3. LinuxターミナルでのMySQLの使用の簡単な紹介

    4. 本番環境でPostgreSQLを管理するためのツールの統合