我有有兩列的TASK_ID表:如何在MySQL中選擇多個客戶端時避免競爭狀況?
`tid`:task id,
`state`:0:unfinished,1:processing,2:finished
這很容易,如果我只用一個客戶端(Perl腳本):取一個unfinished
任務ID,更新爲processing
,過程,然後將其更新到finished
在循環中。
但我打算使用幾個客戶做任務。有可能兩個客戶端在同一時間獲取記錄,如何避免它?
我有有兩列的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