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处,执行模式转换为串行,所以在当前线程执行完毕前,其他线程被挂起。最终结果,既保证了用户资金更新正确,又保证了明细数据先入先出,资金记录不乱

猜你喜欢

转载自blog.csdn.net/u013062667/article/details/79097065