標籤:架構設計 電商 -o tps div 依賴 單節點 無限 叢集
Java開源生鮮電商平台-OMS訂單系統中並發問題和鎖機制的探討與解決方案(源碼可下載)
說明:Java開源生鮮電商中OMS訂單系統中並發問題和鎖機制的探討與解決方案:
問題由來
假設在一個訂單系統中(以火車票訂單系統為例),使用者A,使用者B都要預定從成都到北京的火車票,A、B在不同的售票視窗均同時查詢到了某車廂臥鋪中、下鋪位有空位。使用者A正在猶豫訂中鋪還是下鋪,這時使用者B果斷訂購了下鋪。當使用者A決定訂下鋪時,系統提示下鋪已經被預訂,請重新選擇鋪位。在這個系統情境中,我們來探討一下,火車票系統是怎樣處理並發事件以及怎麼利用鎖機制來避免重複訂票的。
設想的方案
方案1:
為了避免重複訂票,大部分人會想到在做訂票操作前,去資料庫查詢該鋪位是否已經被預訂,假設“鋪位”資料庫表增加標記欄位FLAG(空閑:0;已預訂:1),如果查詢到鋪位的FLAG欄位值為1,那麼預訂就不成功,如果為0就成功預訂,並把FLAG置為1。這種方案如果在業務量很少的系統中,或許可行。但業務量較大時,特別是火車票這樣的業務量,就會出現問題。問題在,當使用者A、使用者B同時對同一鋪位預訂時,雖說是“同時”,但對於資料庫操作來說一定是有先後順序的,假設A在查詢該鋪位的FLAG時,值為0,準備預訂並將值設為1,而與此同時B已經預訂成功,並已將FLAG設為1。而A因為沒有即時查詢到FLAG=1,因此也預訂成功,又將FLAG設為1。
A FLAG=0 時刻=T1 (查詢)
B FLAG=0 時刻=T2 (查詢)
B FLAG=1 時刻=T3 (更新)
A FLAG=1 時刻=T4 (更新)
這樣就造成了重複訂票,在購票高峰期,使用這樣的方案,重複訂票不可避免。
方案2:
我們想到了利用資料庫的悲觀鎖來解決這個問題,設想假如使用者A查詢到想預訂的票,使用者B根本都查詢不到,只有A一個人能看到,那是不是沒有重複訂票的可能了,因為壓根沒人跟他搶。可以這樣實現這個方案:
select * from table where …… for update skip locked,該語句是查詢使用者指定條件的票資訊,並加鎖(for update),如果有記錄已經被鎖則自動跳到下一條記錄(skip locked),這樣誰先查詢誰就可以慢慢的考慮要上鋪還是下鋪。但火車票系統是這樣做的嗎?顯然不是,因為這樣使用者體驗太不好,票實際還很多,但確看不到買不到,這顯然不合理。
方案3:
我們又想到了從程式層面來解決並發問題,最簡便的方式是利用synchronized來處理,但我們要知道一個大型系統必然是叢集方式部署的,synchronized只能解決單節點環境的並發問題,要解決此問題還是必須依賴全域性的鎖機制。
方案4:
既然又回到了在資料庫上加鎖,我們又想一下如果我們在查詢時,使用樂觀鎖,但在預訂之前使用悲觀鎖會怎樣呢?例如我們查詢時:
select * from table where ……
使用者A、使用者B都查詢到了相同的票資訊(中鋪和下鋪),使用者A或使用者B在預訂時做一次悲觀鎖:
select * from table where …… for update(只對預訂的票做悲觀鎖)
此時後者在預訂時,無法擷取該記錄的鎖,自然就無法預訂,避免了重複預訂的問題。
目錄:
1.Java開源生鮮電商平台-系統簡介 https://www.cnblogs.com/jurendage/p/9012355.html
2.Java開源生鮮電商平台-系統架構與技術選型(源碼可下載) https://www.cnblogs.com/jurendage/p/9012922.html
3.Java開源生鮮電商平台-盈利模式詳解(源碼可下載) https://www.cnblogs.com/jurendage/p/9016411.html
4.Java開源生鮮電商平台-使用者表的設計(源碼可下載) https://www.cnblogs.com/jurendage/p/9017912.html
5.Java開源生鮮電商平台-商品表的設計(源碼可下載) https://www.cnblogs.com/jurendage/p/9022917.html
6.Java開源生鮮電商平台-訂單表的設計(源碼可下載) https://www.cnblogs.com/jurendage/p/9029467.html
7.Java開源生鮮電商平台-支付模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9034444.html
8.Java開源生鮮電商平台-購物車模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9039195.html
9.Java開源生鮮電商平台-推薦系統模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9044283.html
10.Java開源生鮮電商平台-財務系統模組的設計與架構(源碼可下載)https://www.cnblogs.com/jurendage/p/9049318.html
11.Java開源生鮮電商平台-賬單模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9053417.html
12.Java開源生鮮電商平台-提現模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9053523.html
13.Java開源生鮮電商平台-訂單抽成模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9059304.html
14.Java開源生鮮電商平台-搜尋模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9062649.html
15.Java開源生鮮電商平台-售後模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9066307.html
16.Java開源生鮮電商平台-監控模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9070442.html
17.Java開源生鮮電商平台-異常模組的設計與架構(源碼可下載)https://www.cnblogs.com/jurendage/p/9075219.html
18.Java開源生鮮電商平台-效能最佳化以及伺服器最佳化的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9081062.html
19.Java開源生鮮電商平台-安全設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9087581.html
20.Java開源生鮮電商平台-優惠券設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9091587.html
21.Java開源生鮮電商平台-通知模組設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9095078.html
22.Java開源生鮮電商平台-團購模組設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9098368.html
23.Java開源生鮮電商平台-伺服器部署設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9103339.html
24.Java開源生鮮電商平台-系統報表設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9108863.html
25.Java開源生鮮電商平台-源碼地址公布與思考和建議 https://www.cnblogs.com/jurendage/p/9114796.html
26.Java開源生鮮電商平台-RBAC系統許可權的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9120168.html
27.Java開源生鮮電商平台-物流配送的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9124947.html
28.Java開源生鮮電商平台-庫存管理設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9130455.html
29.Java開源生鮮電商平台-銷售管理設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9131557.html
30.Java開源生鮮電商平台-電商促銷業務分析設計與系統架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9137815.html
31.Java開源生鮮電商平台-一次代碼重構的實戰案例(源碼可下載) https://www.cnblogs.com/jurendage/p/9143105.html
32.Java開源生鮮電商平台-商品價格的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9148906.html
33.Java開源生鮮電商平台-定時器,定時任務quartz的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9153835.html
34.Java開源生鮮電商平台-高並發的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9159020.html
35.Java開源生鮮電商平台-技術方案與文檔下載(源碼可下載) https://www.cnblogs.com/jurendage/p/9162190.html
36.Java開源生鮮電商平台-積分,優惠券,會員折扣,簽到、預售、拼團、砍價、秒殺及抽獎等促銷模組架構設計(源碼可下載) https://www.cnblogs.com/jurendage/p/9165594.html
37.Java開源生鮮電商平台-供應鏈模組的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9171467.html
38.Java開源生鮮電商平台-會員積分系統的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9176010.html
39.Java開源生鮮電商平台-redis緩衝在商品中的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9181380.html
40.Java開源生鮮電商平台-商品無限極目錄的設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9185990.html
41.Java開源生鮮電商平台-物流動態費率、免運費和固定運費設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9189736.html
42.Java開源生鮮電商平台-商品的spu和sku資料結構設計與架構(源碼可下載) https://www.cnblogs.com/jurendage/p/9194551.html
43.Java開源生鮮電商平台-你應該保留的一些學習態度與學習方法(源碼可下載) https://www.cnblogs.com/jurendage/p/9197096.html
Java開源生鮮電商平台-Java後端產生Token架構與設計詳解(源碼可下載),如果需要下載的話,可以在我的github下面進行下載。
https://github.com/137071249/
群號:168096884
Java開源生鮮電商平台-OMS訂單系統中並發問題和鎖機制的探討與解決方案(源碼可下載)