Как можно было влиять на точные строки SQL UPDATE
оператор в MySQL?
У меня есть многие клиенты на многих компьютерах, которые могут обновлять строки в той же таблице на основе WHERE
пункты в любое время и каждый клиент должны сделать что-то в другой системе для каждой строки, на которую они влияют, так получение списка затронутых объектов должно быть точно и не уязвимо для условий состязания.
Некоторая поддержка баз данных UPDATE ... OUTPUT UPDATED.id WHERE ...
например, SQL Server.
Как можно сделать это атомарное UPDATE
/SELECT
в MySQL?
(Я видел предложения выполнения SELECT
сначала и затем с помощью идентификаторов в качестве IN
пункт в UPDATE
. Но другой клиент мог бы выполнить то же SELECT
и получите те же строки, пока первый клиент ставит в очередь UPDATE
и т.д.?)
Используйте блокировку таблиц или транзакции (если они поддерживаются механизмом хранения) для предотвращения состояний гонки.
LOCK TABLES tablename;
SELECT * FROM tablename WHERE x.
do something else
UPDATE tablename SET y WHERE x.
UNLOCK TABLES
Это то, что я использовал раньше, и есть экземпляр кого-то другого, использующего его здесь, в Stackoverflow :
UPDATE my_table SET
id = (SELECT @id := id),
<column> = 'value'
WHERE <condition>;
@id
будет содержать идентификатор обновленной строки или NULL
, если строка не обновлялась. Это будет работать только для обновлений с одной строкой.