【Mysql】记录乐观锁的一次实战

12 篇文章 0 订阅

最近在做一个项目的时候,需要操作智能门锁,其中远程添加密码的时候,有个密码的索引号,只能在0-99之间取值,这个应用将来可能使用nginx做负载均衡,所以我想在添加密码数据的时候,使用乐观锁来解决并发问题。

表设计

在这里插入图片描述lock_pwd_id 主键 int(11)
lock_id 门锁标识 vc(36)
pwd_sn 密码序号 int(11)
version 版本号 int(11)

SQL

    <update id="updateLockPwdSn" parameterType="LockPwd">
        update lock_pwd set pwd_sn = #{pwdSn}, version = version + 1
        where lock_id = #{lockId} and version = #{version}
    </update>

使用场景

    // 先查询门锁密码序号数据
    LockPwd lockPwdObj = lockPwdService.selectLockPwdByLockId(lockId);
            
    Long pwdSn = lockPwdObj.getPwdSn();
    long _pwdSn = pwdSn + 1;
    ......
    // 后更新门锁密码表
    LockPwd lockPwd = new LockPwd();
    lockPwd.setLockId(lockId);
    lockPwd.setVersion(lockPwdObj.getVersion());
    lockPwd.setPwdSn(_pwdSn);
    lockPwdService.updateLockPwdSn(lockPwd);

假设有多个请求过来,同一时刻读取到密码数据,但是执行肯定有先后,所以使用version数据项加个限制,必定有一个会执行失败。

写给自己

虽然用到了乐观锁技术,但是实际上并没有彻底解决我的问题,假如我一把锁的顺序号已经更新到99了,那么我需要重复利用中间已失效的序号,这是一个需要解决的问题。
但是仍要记录一下,避免自己遗忘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jinwen5290

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值