दो प्रश्नों के आसपास एक लेन-देन रखें, और FOR UPDATE
. का उपयोग करें SELECT
. में विकल्प उन पंक्तियों को लॉक करने के लिए क्वेरी करें जिनकी उसने जांच की थी। कोई अन्य कनेक्शन जो उस पंक्ति को पढ़ने का प्रयास करता है, लेन-देन किए जाने तक निलंबित रहेगा।
सुनिश्चित करें कि आपके पास WHERE
. में आपके द्वारा परीक्षण किए गए कॉलम पर एक इंडेक्स है क्लॉज, इसलिए इसे स्कैन नहीं करना होगा और अपनी इच्छित पंक्तियों को खोजने से पहले चेक की गई सभी पंक्तियों को लॉक करना होगा।
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;