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

Php MYSQL如何确保行不会被更新多次?,php,mysql,Php,Mysql,我有多个工人选择和更新行 身份证状态 10新 11新的 12岁 13岁 辅助进程选择“新”行并将其状态更新为“旧”。 如果两个工人同时选择同一行怎么办? 我的意思是worker1选择一个新行,在worker1更新其状态之前,worker2选择同一行 我应该在一个查询中选择并更新还是有其他方法?您可以在读取之前锁定表,然后在写入之后解锁表。这将消除两名工人同时更新同一记录的机会 您可以在读取前锁定表,然后在写入后解锁表。这将消除两名工人同时更新同一记录的机会 根据您的数据库存储引擎(InnoDB、

我有多个工人选择和更新行

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

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


我应该在一个查询中选择并更新还是有其他方法?

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


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


根据您的数据库存储引擎(InnoDB、MyIsam等),您可以在用户修改表时锁定该表。然后,它会将相同的操作保留到同一个表。

根据您的数据库存储引擎(InnoDB、MyIsam等),您可以在用户修改表时锁定该表。然后,它会将相同的操作保留在同一个表中。

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

能否在PHP逻辑中设置条件以表示锁定?类似于在一行上设置一个状态属性,该属性将阻止第二个用户执行更新。这可能需要在更新之前查询数据库,以确保行未被锁定。

您可以使用锁定表,但有时我更喜欢以下解决方案(使用伪代码):


您可以使用锁表,但有时我更喜欢以下解决方案(使用伪代码):


在更新之前查询数据库不是很好的并发保护-它可能仍然在更新之间被更新。在更新之前查询数据库不是很好的并发保护-它可能仍然在更新之间被更新。您在代码中所做的也是我所做的。我不认为这是最有效的,但它是简单的,它的工作。非常感谢。您在代码中所做的也是我所做的。我不认为这是最有效的,但它是简单的,它的工作。非常感谢。锁定是否阻止读取/选择?因为如果我仍然可以选择,我可能只使用下面提到的@daremon概念。如果您执行写入锁定,则在尝试读取或写入时,所有其他会话都将被阻止。锁定是否阻止读取/选择?因为如果我仍然可以选择,我可能只使用下面提到的@daremon概念。如果您执行写入锁定,则在尝试读取或写入时,所有其他会话都将被阻塞。
// 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