最近在做一个项目的时候,需要操作智能门锁,其中远程添加密码的时候,有个密码的索引号,只能在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了,那么我需要重复利用中间已失效的序号,这是一个需要解决的问题。
但是仍要记录一下,避免自己遗忘。