我有多工人选择和更新行。MYSQL我怎样才能确保行不会超过一次?
id状态 10个新 11新 12岁 13岁
人员通过选择 '新' 行,并更新其状态为 '旧'。 如果两名工人同时选择相同的行怎么办? 我的意思是,worker1选择一个新行,并且在worker1更新其状态之前,worker2选择同一行?
我应该在一个查询中进行SELECT和UPDATE还是有另一种方式?
我有多工人选择和更新行。MYSQL我怎样才能确保行不会超过一次?
id状态 10个新 11新 12岁 13岁
人员通过选择 '新' 行,并更新其状态为 '旧'。 如果两名工人同时选择相同的行怎么办? 我的意思是,worker1选择一个新行,并且在worker1更新其状态之前,worker2选择同一行?
我应该在一个查询中进行SELECT和UPDATE还是有另一种方式?
您可以在读取之前锁定表格,并在写入后解锁。这将消除两名工人同时更新同一记录的可能性。
根据您的数据库存储引擎(InnoDB的,MyISAM数据等),您可以锁定该表,而一个人对矫正它。然后它会对同一张桌子保持同样的动作。
你可以在你的PHP逻辑中加入条件来暗示锁吗?就像在行上设置一个状态属性一样,可以防止第二个用户执行更新。这可能需要在更新之前查询数据库以确保该行未被锁定。
只是在更新之前查询数据库并不是很好的并发保护 - 它可能仍然会在两者之间进行更新。 – 2009-07-08 23:27:06
您可以使用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
是否锁定防止读/ SELECT?如果我仍然可以选择,可以使用下面提到的@daremon这个概念。 – 2009-07-10 01:51:12
如果您执行写入锁定,则所有其他会话在尝试读取或写入时都会阻止。 – Pro777 2009-07-10 13:47:50