如何在MySQL中选择多个客户端时避免竞争状况?
问题描述:
我有有两列的TASK_ID表:如何在MySQL中选择多个客户端时避免竞争状况?
`tid`:task id,
`state`:0:unfinished,1:processing,2:finished
这很容易,如果我只用一个客户端(Perl脚本):取一个unfinished
任务ID,更新为processing
,过程,然后将其更新到finished
在循环中。
但我打算使用几个客户做任务。有可能两个客户端在同一时间获取记录,如何避免它?
答
如果您的mysql表引擎是INNODB,那么它会在更新表记录时锁定该特定行,以便其他请求不会与以前的更新发生冲突。
答
有更新是这样的:
update task_id set state=1 where tid=? and state=0;
然后检查更新实际修改的记录。
如果您的表引擎是MyISAM,您可以明确地锁定和解锁表。看看这个功能的“LOCK TABLES”。尽管如此,InnoDB仍然是一条更干净的路。 – oalders 2012-03-20 16:11:31