使用PHP+MYSQL做了一個內部使用的小工具, 就是使用者有使用者名稱,登入成功之後, 去伺服器請求資料, 請求資料的特徵是,資料庫某個表的
status = 0
的一個資料,代碼大概這樣寫的:
'select * from dir where status = 0 limit 1'
請求成功之後,將其status
設定為-1, 但是在使用者同時發起請求的時候, 經常出現請求同一個資料的情況, 這種情況怎麼可以比較快的解決呀?資料庫加鎖? 比較急--剛剛接觸web的新人--
回複內容:
使用PHP+MYSQL做了一個內部使用的小工具, 就是使用者有使用者名稱,登入成功之後, 去伺服器請求資料, 請求資料的特徵是,資料庫某個表的status = 0
的一個資料,代碼大概這樣寫的:
'select * from dir where status = 0 limit 1'
請求成功之後,將其status
設定為-1, 但是在使用者同時發起請求的時候, 經常出現請求同一個資料的情況, 這種情況怎麼可以比較快的解決呀?資料庫加鎖? 比較急--剛剛接觸web的新人--
事務
select 時加上悲觀鎖 for update
show code
begin$id = select id from table where status=0 for update;xxxxxxTODO SOMETHINGxxxxxupdate table set status=1 where id=$id;commit
樓上“大爺”說了支援事務類引擎(比如InnoDB)的解決辦法,對於MyISAM則無解。
既然只是內部使用的小工具,我來個簡單的思路:
如果只是單條資料,先更新再處理,處理失敗則復原。譬如
UPDATE `dir` SET `status`=-1 WHERE `status`=0# 這樣條件合理的話只有一個請求會更新成功,返回1,其餘請求返回0更新失敗。# 繼續原來的邏輯,如果原來的邏輯處理不通過則將status更新回0,這樣有點類似於一個鎖
如果是大量資料,第一個請求到達後先加檔案鎖(例如寫個xxx.lock的空檔案)再查資料庫,每次請求前檢查檔案鎖是否存在,如果已經存在則取消本次請求。