2012-03-20 74 views
3

我有有两列的TASK_ID表:如何在MySQL中选择多个客户端时避免竞争状况?

`tid`:task id, 
`state`:0:unfinished,1:processing,2:finished 

这很容易,如果我只用一个客户端(Perl脚本):取一个unfinished任务ID,更新为processing,过程,然后将其更新到finished在循环中。

但我打算使用几个客户做任务。有可能两个客户端在同一时间获取记录,如何避免它?

回答

3

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

+0

如果您的表引擎是MyISAM,您可以明确地锁定和解锁表。看看这个功能的“LOCK TABLES”。尽管如此,InnoDB仍然是一条更干净的路。 – oalders 2012-03-20 16:11:31

2

有更新是这样的:

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

然后检查更新实际修改的记录。