我有多个工人SELECTing和UPDATing row。
身份证明状态 10新 11新 12岁 13岁
工人选择一个“新”行并将其状态更新为“旧”。 如果两个工人同时选择同一行怎么办? 我的意思是worker1选择一个新行,在worker更新其状态之前,worker2选择同一行?
我应该在一个查询中进行选择和更新,还是有另一种方式?
答案 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)
您可以在阅读之前锁定桌子,并在写完后将其解锁。这将消除两名工人同时更新同一记录的机会。
答案 2 :(得分:0)
根据您的数据库存储引擎(InnoDB,MyIsam等),您可以在人员修改表时锁定表。然后它会在同一张桌子上保持同样的动作。
答案 3 :(得分:0)
你可以在PHP逻辑中加入条件来暗示锁吗?就像在行上设置一个状态属性一样,会阻止第二个用户执行更新。这可能需要在更新之前查询数据库,以确保该行未被锁定。