2012-03-20 84 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; 

然後檢查更新實際修改的記錄。