企業級電商平臺提供商,為企業級商家提供電商平臺搭建及解決方案服務

全國熱線:4008-868-127

訂單系統中并發問題和鎖機制的探討

2019-09-30 852
分類: 技術干貨

從程序層面來解決并發問題,最簡便的方式是利用synchronized來處理,但我們要知道一個大型系統必然是集群方式部署的,synchronized只能解決單節點環境的并發問題,要解決此問題還是必須依賴全局性的鎖機制。

問題由來

假設在訂單管理系統開發方案中(以火車票訂單系統為例),用戶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。

訂單系統中并發問題和鎖機制的探討

這樣就造成了重復訂票,在購票高峰期,使用這樣的方案,重復訂票不可避免。

方案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(只對預訂的票做悲觀鎖)

此時后者在預訂時,無法獲取該記錄的鎖,自然就無法預訂,避免了重復預訂的問題。

文章來源:博客園

<數商云(www.martinakohl.com)是國內知名企業級電商平臺提供商,為企業級商家提供最佳的系統開發(多種模式電商平臺搭建:B2B/B2B2C/B2C/O2O/新零售等)、供應系統搭建電商解決方案服務>

網站聲明:以上內容為數商云電子商務系統網站的原創文章,如需轉載,請注明出處,謝謝合作!
電商頭條文章
1 數商云互聯網采購解決方案丨為供應商管理提供了新的技術手段
通過數商云提供的集采平臺和聯邦儲備平臺等信息網絡的建設,發電企業和下游供應商可以逐步共享采購信息,提高供應商管理水平,將采購需求計劃與庫存控制和平衡庫相結合,加快庫存周轉,實現集中采購和電子采購。
2 珠寶零售企業管理系統 – 原系統分析
作為服務端的SQL Server 2005放置在服務器上,作為客戶端的“總部管理系統”和“分店管理系統”分別布置在客戶機上。服務端通過100M光纖接入互聯網,對外開發SQL的1433端口以便客戶端連接;客戶端通過各自的ADSL接入互聯網,程序打開時自動連接服務器。
3 開發電商平臺選擇JAVA語言還是PHP語言?
現在很多行業都通過電子商務拓展業務,所以商城系統開發成為很多企業的剛性需求。一般有一點技術基礎的客戶應該知道目前商城系統開發主流語言有兩個,PHP和Java。那么很多客戶朋友會糾結是選擇哪個語言開發好呢?其實PHP和Java都是非常主流的開發語言,并且市面上均有很成功的大型平臺,所以可以說這兩個開發語言各有千秋吧。
4 一份b2b系統分析報告
目前的中國網絡發展的規模決定了其市場容量和商業機會的有限,真正具有消費實力并能形成購買力的群體,依然遠不足以與現實生活中的傳統商業模式相匹敵,同時,目前網絡人口的結構也決定了只有少數商品可能馬上在網絡上銷售。要開展B2B電子商務,主要有以下功能:
5 B2C電子商務網站技術框架
電子商務平臺總體結構的設計應從體系、功能、信息、過程等各個方面保證整個電子商務平臺總體目標的實現,以提高市場競爭能力。總體結構的設計應考慮以下設計原則:
汤姆影院tom最新网址 console.log();