mysql的乐观锁,以及注释<![CDATA[]]>

本文介绍了一种使用MySQL乐观锁机制防止高并发下投资金额超出目标金额的方法。通过为数据库表添加version字段,确保多线程环境下数据的一致性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 做的项目中,有一个功能是用户投资,需要每次更改所投资项目的剩余完成金额,而且最终投资不能超过投资目标金额.但是当多线程同时操作访问修改数据库的时候,可能会造成超出的状况.为了避免这种情况发生,我使用了mysql的乐观锁机制.
    所以我给表中数据增加了一个version字段来控制数据的更改操作记录,原理就是每次用户要更改数据时,mysql执行语句时就会多一个判断,判断用户当前提交的version和当前要修改的数据中的version是否相同,如果不同则更改数据库数据失败.
    当然这是简单的防止超卖例子,真正解决高并发的问题,还是要用到其他技术,如消息队列等.
LoanInfo loanInfo = loanInfoMapper.selectLoanInfoByLoanId(loanId);// 根据产品标识获取产品详情
        int version = loanInfo.getVersion();// 获取当前产品记录的版本号

        paramMap.put("uid", sessionUser.getId());//用户标识
        paramMap.put("phone", sessionUser.getPhone());//用户手机号
        paramMap.put("loanId", loanId);//产品标识
        paramMap.put("bidMoney", bidMoney);//投资金额
        paramMap.put("version", version);

        int updateLoanInfoCount = loanInfoMapper.updateLoanInfoById(paramMap);

    <!-- 根据产品标识更新产品信息 -->
    <update id="updateLoanInfoById">
    <![CDATA[
        update 
            b_loan_info 
        set 
            left_product_money = left_product_money-#{bidMoney},
            version = version+1
        where 
            id = #{loanId} and version = #{version} and (left_product_money - #{bidMoney}) >= 0
    ]]>
    </update>
  1. 如上,用户每次点击投资,都会调用查询当前投资信息的方法,得到当前version,然后修改数据库,数据库会进行判断version版本字段信息是否相同.因为每次修改数据库成功,version会加1,所以如果出现多线程同时进行修改的时候,就只有一个会成功.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值