Letakkan transaksi di sekitar dua kueri, dan gunakan FOR UPDATE
pilihan di SELECT
query untuk mengunci baris yang diperiksa. Koneksi lain apa pun yang mencoba membaca baris itu akan ditangguhkan hingga transaksi dilakukan.
Pastikan Anda memiliki indeks pada kolom yang Anda uji di WHERE
klausa, sehingga tidak perlu melakukan pemindaian dan mengunci semua baris yang diperiksa sebelum menemukan yang Anda inginkan.
START TRANSACTION;
SELECT @id := `id`,`item`
FROM `queue_items`
WHERE `processed_at` IS NULL AND `completed_at` IS NULL
ORDER BY `id` ASC
LIMIT 1
FOR UPDATE;
UPDATE `queue_items` SET `processed_at` = @processedAt WHERE `id` = @id
COMMIT;