MYSQL如何确保行不会多次更新UPDATED?

时间:2009-07-08 22:01:56

标签: php mysql

我有多个工人SELECTing和UPDATing row。

身份证明状态 10新 11新 12岁 13岁

工人选择一个“新”行并将其状态更新为“旧”。 如果两个工人同时选择同一行怎么办? 我的意思是worker1选择一个新行,在worker更新其状态之前,worker2选择同一行?

我应该在一个查询中进行选择和更新,还是有另一种方式?

4 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:2)

您可以在阅读之前锁定桌子,并在写完后将其解锁。这将消除两名工人同时更新同一记录的机会。

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

答案 2 :(得分:0)

根据您的数据库存储引擎(InnoDB,MyIsam等),您可以在人员修改表时锁定表。然后它会在同一张桌子上保持同样的动作。

答案 3 :(得分:0)

你可以在PHP逻辑中加入条件来暗示锁吗?就像在行上设置一个状态属性一样,会阻止第二个用户执行更新。这可能需要在更新之前查询数据库,以确保该行未被锁定。