作成したような競合状態を防ぐために、ここに何らかのロックを追加する必要があります。
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キーを生成します。