首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL如何确保行不会被多次更新?

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

Stack Overflow用户
提问于 2009-07-08 22:01:56
回答 4查看 303关注 0票数 1

我有多个工作线程SELECTing和UPDATing行。

id状态10新11新12旧13旧

Worker选择一个“new”行,并将其状态更新为“old”。如果两个工作进程同时选择同一行,该怎么办?我的意思是,在worker one更新其状态之前,worker1选择了一个新行,而worker2选择了相同的行?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-08 22:04:46

您可以在读取之前锁定表,并在写入之后解锁它。这将消除两个工作人员同时更新相同记录的机会。

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

票数 1
EN

Stack Overflow用户

发布于 2009-07-08 23:11:58

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

代码语言:javascript
复制
// 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
票数 3
EN

Stack Overflow用户

发布于 2009-07-08 22:05:52

根据您的数据库存储引擎(InnoDB、MyIsam等),您可以在用户修改表时将其锁定。然后,它会将类似的行为保留在同一张表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1100774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档