MYSQL Как я могу убедиться, что строка не обновляется более одного раза? - PullRequest
1 голос
/ 09 июля 2009

У меня есть несколько работников, которые ВЫБИРАЮТ и ОБНОВЛЯЮТ строку.

идентификатор статуса 10 новых 11 новых 12 лет 13 лет

Работник выбирает «новую» строку и обновляет ее статус до «старой». Что если два работника одновременно выберут одну и ту же строку Я имею в виду, что worker1 выбирает новую строку, и перед тем, как работник один обновляет свой статус, worker2 выбирает ту же строку?

Должен ли я выбрать и обновить в одном запросе или есть другой способ?

Ответы [ 4 ]

3 голосов
/ 09 июля 2009

Вы можете использовать LOCK TABLES, но иногда я предпочитаю следующее решение (в псевдокоде):

// get 1 new row
$sql = "select * from table where status='new' limit 0, 1";
$row = mysql_query($sql);

// update it to old while making sure no one else has done that
$sql = "update table set status='old' where status='new' and id=row[id]";
mysql_query($sql);

// check
if (mysql_affected_rows() == 1)
  // status was changed
else
  // failed - someone else did it
2 голосов
/ 09 июля 2009

Вы можете заблокировать таблицу перед чтением и разблокировать ее после записи. Это исключит возможность одновременного обновления одной и той же записи двумя работниками.

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

0 голосов
/ 09 июля 2009

не могли бы вы поместить в свою логику PHP условия для блокировки? Например, установить атрибут статуса в строке, которая не позволит второму пользователю выполнить обновление. Это может потребовать запроса базы данных перед обновлением, чтобы убедиться, что строка не заблокирована.

0 голосов
/ 09 июля 2009

В зависимости от механизма хранения вашей базы данных (InnoDB, MyIsam и т. Д.), Вы можете заблокировать таблицу, пока кто-то ее модифицирует. Затем он сохранит одновременные действия за одним столом.

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