html - PHP+Mysql 請求資料重複的問題

來源:互聯網
上載者:User
關鍵字 php mysql html
使用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的空檔案)再查資料庫,每次請求前檢查檔案鎖是否存在,如果已經存在則取消本次請求。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.