Как атомарно выбрать и использовать, что выбрать в обновлении - PullRequest
0 голосов
/ 22 апреля 2020

Это то, что у меня есть на данный момент. Однако существуют проблемы с многопоточностью, когда разные потоки запускаются одновременно. Мне нужно, чтобы выбор и обновление происходили атомарно, чтобы этого не происходило.

# Take the results of this select and use them in the update below
SELECT DISTINCT column1 FROM table WHERE column2 IS NOT NULL;

UPDATE table
SET column2 = "test123", column3 = NOW(), column4 = column4 + 1
WHERE column2 IS NULL AND column4 < 3 AND column1 NOT IN (<RESULTS>)
ORDER BY column5 ASC LIMIT 1;

Это выполняется внутри приложения php, где я в настоящее время передаю результаты выбора в запрос на обновление.

Первоначально я пытался использовать select как подзапрос внутри where, но кажется, что MySQL не позволяет вам иметь подзапросы select внутри обновления для той же таблицы. Моя вторая идея состояла в том, чтобы использовать объединение против самого себя, однако, если вы используете объединение в запросе на обновление, вы не сможете использовать порядок по / лимиту, для которого мне нужно установить приоритет.

Единственное, что я могу Можно подумать, чтобы заблокировать всю таблицу перед началом выбора, а затем разблокировать его после обновления. Однако это может вызвать проблемы с узким местом, поскольку эти элементы очереди собираются и обрабатываются очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...