Существуют ли одиночные запросы, обновляющие несколько строк в MySQL Atomi c? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть единственный запрос в таблице MySQL InnoDb, выполняемой в SpringJPA, который обновляет несколько строк. Я хочу убедиться, что запрос завершен и строки, которые он будет обновлять, не могут быть обновлены каким-либо другим процессом. Это в среде с несколькими процессорами, поэтому я должен выполнить блокировку на уровне базы данных.

Сначала я выбираю строки с таким запросом:

select * from tablea where status = 1;

Допустим, это возвращает 3 строки - основные идентификаторы 1,2,3

Я хочу предотвратить одновременное обновление, и я делаю это обновление:

update tablea set status=2 where status=1 and primaryIds in (1,2,3);

То, что я пытаюсь выполнить sh, это проверить что все строки, которые я пытаюсь обновить, по-прежнему имеют исходное значение в статусе и не обновлялись ниже меня. Затем я получаю количество обновленных строк и сравниваю его с количеством первичных идентификаторов (3), чтобы узнать, обновил ли мой запрос все строки. Мой вопрос в этом запросе atomi c - вернет ли он 3 или 0. И если количество строк намного больше, он даст разрешение другому потоку, пытающемуся выполнить такое же обновление для обновления некоторых строк. Я тестировал это с одной строкой, и он отлично работает.

1 Ответ

0 голосов
/ 28 мая 2020

Да, это так. Предполагая, что у вас включена автоматическая фиксация (это значение по умолчанию, когда вы не начали транзакцию), InnoDB автоматически помещает транзакцию вокруг каждого запроса, что делает его atomi c. Фактически это эквивалент:

START TRANSACTION;
update tablea set status=2 where status=1 and primaryIds in (1,2,3);
COMMIT;
...