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

行を選択してロックしてから更新します

    作成したような競合状態を防ぐために、ここに何らかのロックを追加する必要があります。

    UPDATE persons SET processing=1 WHERE id=:id AND processing=0
    

    これにより、ダブルロックを回避できます。

    これをさらに改善するには、主張に使用できるロック列を作成します。

    UPDATE persons
      SET processing=:processing_uuid
      WHERE processing IS NULL
      LIMIT 1
    

    これにはVARCHARが必要です 、インデックス付きのprocessing デフォルトがNULLであると主張するために使用される列 。結果で行が変更された場合は、レコードを要求し、次を使用してそのレコードを操作できます。

    SELECT * FROM persons WHERE processing=:processing_uuid
    

    申し立てを試みるたびに、新しい申し立てUUIDキーを生成します。



    1. CakephpデータソースクラスMySQLが見つかりませんでした

    2. アナリティクス、ビッグデータ、データマイニング、Hadoop、NoSQL、データサイエンスのトップFacebookグループ

    3. mysqli_fetch_assocを使用して同じ結果を2回表示できないのはなぜですか?

    4. 同時アクセス時にテーブル内の特定の行数をマークする方法