如果MySQL中有多个客户端选择,如何避免竞争条件?

如果MySQL中有多个客户端选择,如何避免竞争条件?,mysql,perl,Mysql,Perl,我有一个task_id表,它有两列: `tid`:task id, `state`:0:unfinished,1:processing,2:finished 如果我只使用一个客户端(Perl脚本),那么很容易:在循环中获取一个未完成的任务id,将其更新为处理,处理它,并将其更新为完成的 但我计划使用几个客户来完成这项任务。有可能两个客户端同时获取一条记录,如何避免它?如果您的mysql表的引擎是INNODB,那么它会在更新表记录时锁定该特定行,以便其他请求不会与以前的更新冲突。更新类似: up

我有一个task_id表,它有两列:

`tid`:task id,
`state`:0:unfinished,1:processing,2:finished
如果我只使用一个客户端(Perl脚本),那么很容易:在循环中获取一个
未完成的
任务id,将其更新为
处理
,处理它,并将其更新为
完成的


但我计划使用几个客户来完成这项任务。有可能两个客户端同时获取一条记录,如何避免它?

如果您的mysql表的引擎是INNODB,那么它会在更新表记录时锁定该特定行,以便其他请求不会与以前的更新冲突。

更新类似:

update task_id set state=1 where tid=? and state=0;

然后检查更新是否确实修改了记录。

如果表引擎是MyISAM,则可以显式锁定和解锁表。请查看此功能的“锁定表”。不过,InnoDB将是一种更干净的方式。