久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

關于php 高并發解決的一點思路

涉及搶購、秒殺、抽獎、搶票等活動時,為了避免超賣,那么庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那么我們怎么來解決這個問題呢,我的

我的思路如下(偽代碼):

sql1:查詢商品庫存

if(庫存數量 > 0)
{
//生成訂單...
sql2:同時庫存-1
}

當沒有并發時,上面的流程看起來是再正常不過了,假設同時兩個人下單,而庫存只有1個了,在sql1階段兩個人查詢到的庫存都是>0的,于是最終都執行了sql2,庫存最后變為-1,超售了,這不是我們想要的結果吧。

解決這個問題比較流行的思路我總結了下:
1.用額外的單進程處理一個隊列,下單請求放到隊列里,一個個處理,就不會有并發的問題了,但是要額外的開啟后臺進程以及延遲問題,這里暫不予考慮。這里我可使用消息隊列,我們常用到Memcacheq、Radis。 比如:有100張票可供用戶搶,那么就可以把這100張票放到緩存中,讀寫時不要加鎖。 當并發量大的時候,可能有500人左右搶票成功,這樣對于500后面的請求可以直接轉到活動結束的靜態頁面。進去的500個人中有400個人是不可能獲得商品的。所以可以根據進入隊列的先后順序只能前100個人購買成功。后面400個人就直接轉到活動結束頁面。當然進去500個人只是舉個例子,至于多少可以自己調整。而活動結束頁面一定要用靜態頁面,不要用數據庫。這樣就減輕了數據庫的壓力。
2.mysql樂觀鎖,意思是比如總庫存是2,搶購事件提交時,立馬將庫存+1,那么此時庫存是3,然后訂單生成后,在更新庫存前再查詢一次庫存(因為訂單生成理所當然庫存-1,但是先不急,再查一次庫存返回結果是3),看看跟預期的庫存數量(這里預期的庫存是3)是否保持一致,不一致就回滾,提示用戶庫存不足。這里說道悲觀鎖,可能有朋友會問,那一定有樂觀鎖了吧??這里我就淺談下我所了解的悲觀與樂觀鎖了

悲觀鎖與樂觀鎖是兩種常見的資源并發鎖設計思路,也是并發編程中一個非常基礎的概念。本文將對這兩種常見的鎖機制在數據庫數據上的實現進行比較系統的介紹。

悲觀鎖(Pessimistic Lock)

悲觀鎖的特點是先獲取鎖,再進行業務操作,即“悲觀”的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的“一鎖二查三更新”即指的是使用悲觀鎖。通常來講在數據庫上的悲觀鎖需要數據庫本身提供支持,即通過常用的select … for update操作來實現悲觀鎖。當數據庫執行select for update時會獲取被select中的數據行的行鎖,因此其他并發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

這里需要注意的一點是不同的數據庫對select for update的實現和支持都是有所區別的,例如oracle支持select for update no wait,表示如果拿不到鎖立刻報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中所有掃描過的行都會被鎖上,這一點很容易造成問題。因此如果在mysql中用悲觀鎖務必要確定走了索引,而不是全表掃描。

樂觀鎖(Optimistic Lock)

樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新數據的最后一步再去拿一下鎖就好。

樂觀鎖在數據庫上的實現完全是邏輯的,不需要數據庫提供特殊的支持。一般的做法是在需要鎖的數據上增加一個版本號,或者時間戳,然后按照如下方式實現:

1. SELECT data AS old_data, version AS old_version FROM …;
2. 根據獲取的數據進行業務操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
  // 樂觀鎖獲取成功,操作完成
} else {
  // 樂觀鎖獲取失敗,回滾并重試
}

樂觀鎖是否在事務中其實都是無所謂的,其底層機制是這樣:在數據庫內部update同一行的時候是不允許并發的,即數據庫每次執行一條update語句時會獲取被update行的寫鎖,直到這一行被成功更新后才釋放。因此在業務操作進行前獲取需要鎖的數據的當前版本號,然后實際更新數據時再次對比版本號確認與之前獲取的相同,并更新版本號,即可確認這之間沒有發生并發的修改。如果更新失敗即可認為老版本的數據已經被并發修改掉而不存在了,此時認為獲取鎖失敗,需要回滾整個業務操作并可根據需要重試整個過程。好吧,在此嘮叨總結下這兩個鎖:

總結

  • 【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP定義字符串的四種方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP給源代碼加密的幾種方法匯總(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇php打開本地exe程序,js打開本地exe應用程序,并傳遞相關參數方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP類的反射來實現依賴注入過程以及相關知識點分享,對此有興趣的朋友跟著小編學習下吧。
php遍歷一個文件夾內的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實現達到清空一個目錄的效果。本文給大家分享實例代碼,需要的朋友參考
主站蜘蛛池模板: 久久午夜视频 | 欧美一区二区在线观看视频 | 国产精品自拍啪啪 | 欧美亚洲一区二区三区 | 日韩国产一区二区 | 亚洲欧洲精品一区 | 久久精品国产久精国产 | 精品国产乱码一区二区三 | 91资源在线播放 | 日韩三 | 在线欧美小视频 | 91精品国产一区二区三区蜜臀 | 91免费看片| 国产男女视频 | 欧美精产国品一二三区 | 国产高清免费 | 欧美另类日韩 | 久草资源在线 | 国产精品久久久久影院色老大 | 久久精品日| 国产一区二区三区四区五区3d | 精品久久久久久久久久久久久久久久久 | 日日夜夜天天 | 91精品国产91久久综合桃花 | 日韩另类 | 毛片在线免费 | 久久9精品 | 欧美国产视频 | 99在线观看| 国产激情91久久精品导航 | 成人免费一区二区三区视频网站 | 亚洲精品免费视频 | 欧美成年人网站 | 国产一区二区在线视频 | 色888www视频在线观看 | 国产线视频精品免费观看视频 | 亚洲va欧美va天堂v国产综合 | 91av视频在线观看 | 国产亚洲一区二区精品 | 国产午夜精品一区二区三区四区 | 成人免费视频观看视频 |