Я пытаюсь выполнить запрос, который выполняет несколько вещей ..
- Создать переменную для обновленных идентификаторов
- Обновить все задания из таблицы заданий, где статус = 0
- Выберите все эти обновленные задания.
Причина этого в том, что есть несколько узлов js-кластеров, запрашивающих базу данных, и у меня не может быть сценария, в котором два из них читаютте же самые задания, что и задание, будут обработаны дважды, и это плохо.
У меня это почти есть. Он работает, но ничего не возвращает, хотя и говорит мне:
2 row(s) affected Rows matched: 2 changed: 2 warnings: 0
Вот простая версия таблицы
CREATE TABLE test (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`status` INT(4) NOT NULL,
`task` INT(4) NOT NULL,
PRIMARY KEY (`id`));
Позволяет поместить некоторые данныев таблице ..
INSERT INTO test (status, task)
VALUES (1, 1), (0, 1), (0, 2), (3, 1);
Итак, теперь у нас есть «тестовая» таблица с 4 заданиями. Индексирование состояния выглядит следующим образом ..
0 = unprocessed
1 = processing
3 = completed
Вывод моего запроса должен состоять в том, чтобы обновить строки 2 и 3 с состояния 0 на 1, а затем использовать эти идентификаторы, полученные в операторе выбора, чтобы получить остальныеданных.
Вот мой запрос:
BEGIN;
SET @LastUpdateID = NULL;
UPDATE test
SET status = 1
WHERE status = 0
AND (SELECT @LastUpdateID := CONCAT_WS(',', id, @LastUpdateID));
SELECT * from test where id in (@LastUpdateID);
COMMIT;
Что странно, все работает правильно, просто не возвращает строки из оператора SELECT *. Я даже проверил вывод переменной @LastUpdateID, и она выглядит так: '2,3'
Вот скриншот того, что я получаю в Workbench, и я также подтвердил те же результаты из командной строки.
Вот то, чего я ожидал.