文章目录

  • 表设计
  • SQL
  • 使用场景
  • 写给自己

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

表设计

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

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了,那么我需要重复利用中间已失效的序号,这是一个需要解决的问题。
但是仍要记录一下,避免自己遗忘。