У меня есть единственный запрос в таблице 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. И если количество строк намного больше, он даст разрешение другому потоку, пытающемуся выполнить такое же обновление для обновления некоторых строк. Я тестировал это с одной строкой, и он отлично работает.