Yang perlu Anda lakukan adalah menambahkan semacam kunci di sini untuk mencegah kondisi balapan seperti yang Anda buat:
UPDATE persons SET processing=1 WHERE id=:id AND processing=0
Itu akan menghindari penguncian ganda.
Untuk lebih meningkatkannya lagi, buat kolom kunci yang dapat Anda gunakan untuk mengklaim:
UPDATE persons
SET processing=:processing_uuid
WHERE processing IS NULL
LIMIT 1
Ini membutuhkan VARCHAR
, diindeks processing
kolom yang digunakan untuk mengklaim yang memiliki default NULL
. Jika Anda mendapatkan baris yang dimodifikasi dalam hasil, Anda telah mengklaim catatan dan dapat pergi dan bekerja dengannya dengan menggunakan:
SELECT * FROM persons WHERE processing=:processing_uuid
Setiap kali Anda mencoba dan mengklaim, buat kunci UUID klaim baru.