商品庫超賣的樂觀鎖

2022-07-03 09:09:11 字數 683 閱讀 5197

商品庫存的樂觀鎖實現。

出現場景:

避免商品出現超賣(即成功下單的訂單中商品的庫存數量大於商品現有的庫存量,則稱為商品超賣)的問題,核心技術是利用資料庫的事務鎖機制,即不允許同一商品的庫存記錄在同一時間被不同的兩個資料庫事務修改。

功能實現:

在前柔性事務介紹中所提到的,使用者在進行商品下單操作中,會進行一系列的業務邏輯判斷和操作,對於商品庫存資訊這一訪問熱點資料,如果採用資料庫的悲觀鎖(比如select語句帶for update)模式,則會給訂單處理帶來很大的效能阻塞,所以會採用樂觀鎖的方式實現商品庫存的操作。

實現的方式也比較簡單,也就是在最後執行庫存扣減操作時,將事務開始前獲取的庫存數量帶入到sql語句中與目前資料庫記錄中的庫存數量進行判斷,如果數量相等,則該條更新庫存的語句成功執行;如果不相等,則表示該商品的庫存資訊在當前事務執行過程中已經被其他事務修改,則會放棄該條update的執行,可以採用重試的機制重新執行該事務,避免商品超賣的發生。具體的sql語句示意如下:

update auction_auctions set quantity=#inquantity#,where auction_id=#itemid# and quantity=#dbquantity#

其中#dbquantity#為事務中在update語句執行前,通過select語句獲取到的商品庫存數量

以上就是這次的全部內容!

mysql 樂觀鎖 超賣 秒殺超賣解決方案

方案一 redis事務處理 multi 我們可以使用redis中的監聽 watch 方法,去監聽庫存數量,一旦庫存數量在其他客戶端發生改變,後續操作則會失敗。watch key1 key2 監聽key1 key2有沒有變化,如果有變,則事務取消 方案二 redis分布式鎖 分布式鎖確保只有乙個執行緒...

PHP redis樂觀鎖防止高併發超賣

error level error reporting 0 con new mysqli localhost root root test if con sql select from products where id 1 result mysqli query con,sql aa mysqli...

redis 分布式鎖解決商品超賣問題

用redis的分布式鎖可以解決商品超賣的問題,簡單事例 基於yii2框架 desc 加鎖方法 param lockname string 鎖的名字 param timeout int 鎖的過期時間 return 成功返回identifier 失敗返回false public function get...