2009-07-08 64 views
1

我有多工人选择和更新行。MYSQL我怎样才能确保行不会超过一次?

id状态 10个新 11新 12岁 13岁

人员通过选择 '新' 行,并更新其状态为 '旧'。 如果两名工人同时选择相同的行怎么办? 我的意思是,worker1选择一个新行,并且在worker1更新其状态之前,worker2选择同一行?

我应该在一个查询中进行SELECT和UPDATE还是有另一种方式?

回答

2

您可以在读取之前锁定表格,并在写入后解锁。这将消除两名工人同时更新同一记录的可能性。

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

+0

是否锁定防止读/ SELECT?如果我仍然可以选择,可以使用下面提到的@daremon这个概念。 – 2009-07-10 01:51:12

+1

如果您执行写入锁定,则所有其他会话在尝试读取或写入时都会阻止。 – Pro777 2009-07-10 13:47:50

0

根据您的数据库存储引擎(InnoDB的,MyISAM数据等),您可以锁定该表,而一个人对矫正它。然后它会对同一张桌子保持同样的动作。

0

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

+0

只是在更新之前查询数据库并不是很好的并发保护 - 它可能仍然会在两者之间进行更新。 – 2009-07-08 23:27:06

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 
相关问题