выберите строки, затронутые обновлением

Как можно было влиять на точные строки SQL UPDATE оператор в MySQL?

У меня есть многие клиенты на многих компьютерах, которые могут обновлять строки в той же таблице на основе WHERE пункты в любое время и каждый клиент должны сделать что-то в другой системе для каждой строки, на которую они влияют, так получение списка затронутых объектов должно быть точно и не уязвимо для условий состязания.

Некоторая поддержка баз данных UPDATE ... OUTPUT UPDATED.id WHERE ... например, SQL Server.

Как можно сделать это атомарное UPDATE/SELECT в MySQL?

(Я видел предложения выполнения SELECT сначала и затем с помощью идентификаторов в качестве IN пункт в UPDATE. Но другой клиент мог бы выполнить то же SELECT и получите те же строки, пока первый клиент ставит в очередь UPDATE и т.д.?)

6
задан Will 2 July 2010 в 07:22
поделиться

2 ответа

Используйте блокировку таблиц или транзакции (если они поддерживаются механизмом хранения) для предотвращения состояний гонки.

LOCK TABLES tablename;
SELECT * FROM tablename WHERE x.
do something else
UPDATE tablename SET y WHERE x.
UNLOCK TABLES
2
ответ дан 17 December 2019 в 18:09
поделиться

Это то, что я использовал раньше, и есть экземпляр кого-то другого, использующего его здесь, в Stackoverflow :

UPDATE my_table SET
    id = (SELECT @id := id),
    <column> = 'value'        
    WHERE <condition>;

@id будет содержать идентификатор обновленной строки или NULL , если строка не обновлялась. Это будет работать только для обновлений с одной строкой.

1
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: