1. 程式人生 > >mysql中更新鎖運用

mysql中更新鎖運用

1. 業務場景描述

使用者表(user) 使用者編號 user_id 資金欄位  fund
資金明細表(fund_record) 使用者編號欄位 user_id 更新前資金 before_fund  更新後資金after_fund 消費額度out_fund 增加額度in_fund
需求:在消費使用者資金時,記錄資金變動記錄到明細表
方案:將更新使用者表,新增明細表操作,加入同一事務。加事務級別排他鎖,事務完畢釋放鎖。

2. sql實現細節簡寫

使用者表:update user set fund=fund-額度 where user_id=使用者編號 and fund-額度>=0
明細表:簡單插入略(事務過程中有計算流程)。
執行順序:先update
,若成功,查詢計算,再新增記錄。update不成功,不做後續操作

3. 執行結果

100執行緒併發,單次額度1,使用者更新後,延時1秒執行明細新增。最終資料無錯誤,資料庫鎖超時。成功執行48條。

4. 猜測分析

update 語句新增排他鎖,且是事務級別排他鎖。所有執行緒到update處,執行模式轉換為序列,所以在當前執行緒執行完畢前,其他執行緒被掛起。最終結果,既保證了使用者資金更新正確,又保證了明細資料先入先出,資金記錄不亂