訂單併發這個問題我想你們都是有必定認識的,這裏我說一下個人一些淺見,我會盡量的讓你們瞭解如何解決這類問題。python
在解釋如何解決訂單併發問題以前,須要先了解一下什麼是數據庫的事務。(我用的是mysql數據庫,這裏以mysql爲例)mysql
1) 事務概念redis
一組mysql語句,要麼執行,要麼全不不執行。sql
2) mysql事務隔離級別數據庫
Read Committed(讀取提交內容)多線程
若是是Django2.0如下的版本,須要去修改到這個隔離級別,否則樂觀鎖操做時沒法讀取已經被修改的數據併發
RepeatableRead(可重讀)app
這是這是Mysql默認的隔離級別,能夠到mysql的配置文件中去修改;post
transcation-isolation = READ-COMMITTEDatom
在mysql配置文件中添加這行而後重啓mysql就能夠將事務隔離級別修改至Read Committed
其餘事務知識這裏不會用到就不浪費時間去作介紹了。
悲觀鎖:開啓事務,而後給mysql的查詢語句最後加上for update。
這是在幹什麼呢。可能你們有些不理解,其實就是給資源加上和多線程中加互斥鎖同樣的東西,確保在一個事務結束以前,別的事務沒法對該數據進行操做。
下面是悲觀鎖的代碼,加鎖和解鎖都是須要消耗CPU資源的,因此在訂單併發少的狀況使用樂觀鎖會是一個更好的選擇。
而後就是樂觀鎖查詢了,相比悲觀鎖,樂觀鎖其實並不能稱爲是鎖,那麼它是在作什麼事情呢。
實際上是在你要進行數據庫操做時先去查詢一次數據庫中商品的庫存,而後在你要更新數據庫中商品庫存時,將你一開始查詢到的庫存數量和商品的ID一塊兒做爲更新的條件,當受影響行數返回爲0時,說明沒有修改爲功,那麼就是說別的進程修改了該數據,那麼你就能夠回滾到以前沒有進行數據庫操做的時候,從新查詢,重複以前的操做必定次數,若是超過你設置的次數仍是不能修改那麼就直接返回錯誤結果。
該方法只適用於訂單併發較少的狀況,若是失敗次數過多,會帶給用戶不良體驗,同時適用該方法要注意數據庫的隔離級別必定要設置爲Read Committed 。
最好在使用樂觀鎖以前查看一下數據庫的隔離級別,mysql中查看事物隔離級別的命令爲
樂觀鎖代碼
本文來自:
https://blog.csdn.net/qq_36012543/article/details/79679690?utm_source=copy
-END-