Имам практическо решение за вас, което видях да се прилага в проект на работното ми място. Вместо да използвате само 0 и 1 за непълни и завършени, разширете набора си, за да включите още случаи.
Нека наречем тази колона status . Ето различните стойности на тази колона и съответните състояния на заданието.
- Когато състоянието е 0, заданието не е прието от нито една работна нишка.
- Когато състоянието е 1, заданието е прието от работна нишка и е в процес на обработка.
- Когато състоянието е 2, задачата е неуспешна. (Трябва да вземете предвид възможността за неуспех при обработката.)
- Когато състоянието е 3, задачата е завършена.
Вашите нишки трябва да съдържат логика, така че да приема само задачи, за които състоянието е 0, и да променя състоянието на 1. Това ще забрани на други нишки да приемат тези задачи, които са в процес. Когато задачата приключи, състоянието се задава на 3 и ако задачата не успее, състоянието се задава на 2. След това нишката може да продължи напред и да търси друга работа, която все още трябва да бъде завършена.
Можете също да помолите нишките да обмислят вземането на задачи със състояние 2, но ще трябва да дефинирате логика, за да посочите краен брой повторни опити.
РЕДАКТИРАНЕ:
След дълга дискусия , заедно се натъкнахме на решението. Моят по-горе отговор е добър в по-обобщено състояние, когато „работата“ е процес, който отнема известно време за завършване. Но това не беше така в проблема на ОП.
Така че решението, което в крайна сметка проработи, беше следното:
BEGIN
SELECT * FROM Jobs WHERE JobID = (SELECT * FROM Jobs WHERE completed = 0 LIMIT 1) LOCK IN SHARE MODE;
UPDATE Jobs SET completed = 1 WHERE JobID = (PREVIOUS ID);
COMMIT;