0

MySQL データベースをバックエンド (PHP からアクセス) として使用するプロジェクトに取り組んでいます。ときどき、行を選択して操作を行い、データベース内のレコードを更新します。

別のユーザーが最初の選択の直後に同じ行で同様のプロセスを開始した可能性があり、その変更によって最初のユーザーが行った変更の一部が上書きされる可能性があるのではないかと心配しています (2 番目のユーザーの選択にはまだそれらの変更が含まれていないため)。

これは実際の問題ですか?テーブルをロックする必要がありますか?これはアプリケーションのパフォーマンスに深刻な影響を与えませんか? 他の解決策はありますか?

私の情報を徹底するために、同じデータを変更している可能性のある CRON ジョブもいくつか実行しています。

ありがとう!

4

1 に答える 1

1

トランザクションを明示的に使用する以外に、2 つの解決策を考えることができます。

  • SELECT .. FOR UPDATE を使用します: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
  • 行が他のクエリによって選択されないように値を手動で変更します。

    @update_id を設定:= 0;

    UPDATE table_name SET status= 'IN_PROCESS', id = (SELECT @update_id := id) WHERE status= 'WAITING' AND [your condition] LIMIT 1;

    SELECT @update_id;

ここで、選択する行には status="WAITING" の値が必要です。そして、このクエリが実行されると、ID が選択され、「ステータス」の値が変更されるため、他のクエリで行を選択できなくなります。

于 2014-05-31T17:55:56.727 に答える