Транзакция MySQL не возвращает никаких строк - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь выполнить запрос, который выполняет несколько вещей ..

  1. Создать переменную для обновленных идентификаторов
  2. Обновить все задания из таблицы заданий, где статус = 0
  3. Выберите все эти обновленные задания.

Причина этого в том, что есть несколько узлов 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, и я также подтвердил те же результаты из командной строки.

screenshot of mysql workbench not returning data

Вот то, чего я ожидал. screenshot of mysql workbench displaying correct data

1 Ответ

0 голосов
/ 11 октября 2019

Похоже, кто-то уже ответил MySQL: вернуть обновленные строки

Похоже, ответ такой же, как вы уже делаете ...

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

Попробуйте удалить начало / коммит

...