解決併發所帶來的資料不一致性

2022-08-21 23:27:09 字數 1499 閱讀 7618

測試前提,linux伺服器 ,因為windows伺服器下 nginx + php是fashcgi方式,預設是單程序單執行緒的,所有的併發請求都要排隊處理,所以在windows伺服器下測試時沒有任何效果的。

這段**的邏輯很簡單,類似於商品庫存一樣,stock為庫存,count為購買數量,每購買一次 count + 1,生成乙個隨機的txt檔案,因為是模擬,那麼這裡我們就把txt檔案模擬為訂單吧,每購買一次,生成乙個新的訂單。這個程式正常情況下count數會和生成的txt檔案的數量是一致的,而且訂單數也不會超過庫存數,因為這裡有判斷條件,當count等於stock的時候程式就退出了,也不會有新的訂單生成。但是有一種情況會導致出現訂單數大於庫存數, 那就是 - - - - - - 併發。

接下來先模擬一波非併發的情況。

1.設定count數為0

2.設定訂單數為空

3.用apache ab測試模擬100次請求。

如上圖所示,請求執行完後,count數為10個,訂單數為10個,訂單數是和count數保持一致的。

接下來把log資料夾再次清空,同時把count改為0,測試一下100次請求,10次併發下的結果。

可能壓力測試模擬併發的時候會有丟包,或者隨機數出現相同的了,但是可以看出在併發條件下,txt檔案為15個,count數為10,訂單數和count數已經不一致了。

解決方法一: 加檔案鎖,在多個程序對同乙個檔案進行獨佔鎖定操作,發生阻塞時記錄錯誤日誌,並退出程式

接下來再模擬 100次請求10次併發結果如下

如上圖所示,最終生成的txt檔案和count保持一致,測試成功!!

併發操作會帶來資料的不一致性

髒讀 就是指當乙個事務對資料進行了修改但還沒有提交到資料庫時,另乙個事務訪問並使用了這個資料。不可重複讀 在乙個事務內兩次讀資料之間,第二個事務訪問該資料並進行了修改。丟失修改 兩個事務讀入同一資料並修改,t2提交的結果破壞了t1提交的結果。例如t1讀a修改為a 1,t2也讀a修改為a 1 實際上應...

資料庫併發操作帶來的資料不一致性

事務是併發控制的基本單位,保證事務的acid特性是事務處理的重要任務,而事務acid特性可能遭到破壞的原因之一就是多個事務對資料庫的併發操作造成的。併發操作帶來的資料不一致性重要有丟失修改,不可重複讀,讀 髒 資料。兩個事務t1和t2讀入同乙個資料並修改,t2提交的結果破壞了t1提交的結果,導致了t...

併發操作與資料的不一致性

最近做的 選修課系統 需要考慮這樣乙個問題 資料庫的併發操作帶來的資料庫資料不一致問題 因為是全校性選修課,同一時間點大批學生選課,那麼必然存在多名學生同時對同一資料進行操作 是的問題,如果這種併發操作不加以控制的話,必會造成資料的不一致。一直知道有這種問題,並且知道這種問題的解決方法 加鎖 但是有...