增加了redis分布式锁,但是还是生成了重复数据

增加了redis分布式锁,但是还是生成了重复数据

原因

两个线程

第一个线程先获取锁,然后进行新增,此时第二个线程也进入方法体,尝试获取锁,结果没获取到,继续在5s内尝试,在redis获取锁等待5s的过程中,例如第2s,此时 第一个线程保存结束,释放了锁,但是此时数据还没有保存到数据库中,导致第二个线程获取到锁后,根据code查询数据库并没有查询到数据,也进行了一次保存操作,最终导致生成了两个code相同的数据

解决思路

由于是code重复,分析为什么两个线程生成了同一个code

检查发现生成code的代码逻辑是,通过的查询表中数据量例如有1000条,则code为HY然后➕1,这里就有问题,可以模拟下cas 自旋锁原理 这里是伪代码

思路1

原逻辑

1.查询总条数 例如1000

2.生成客户编码1000+1 code设置为 HY1001

3.保存客户

修改后逻辑

1.查询总条数 例如1000

2.生成客户编码1000+1 code设置为 HY1001

3.保存客户

4.再次查询总条数 判断总条数是否为1001,如果不等于1001 则提示报错

思路2

其实也可以改用redis的自增命令

看具体业务自行选择

修改点2

保存时获取redis锁不用tryLock,直接用lock ,或者tryLock的时间修改为1毫秒或者微秒

java 复制代码
boolean locked = false;
try{
  locked = redisMutexService.tryLock(redisKey, TimeUnit.MICROSECONDS, 1);

t r ylock

先尝试立即获取锁,没获取到则在指定时间内尝试重新获取,超过等待时间则返回false

相关推荐
爱潜水的小L14 分钟前
自学嵌入式day41,数据库
jvm·数据库
rchmin15 分钟前
Redis集群扩容数据迁移方案分析
redis·缓存
橙汁味的风15 分钟前
《数据库系统概论》陈红、卢卫 - 9 - 关系数据库存储管理
数据库·数据库系统概论
胡萝卜的兔17 分钟前
go-zero rpc 分布式 微服务
分布式·rpc·golang
最贪吃的虎19 分钟前
Redis 除了缓存,还能干什么?
java·数据库·redis·后端·缓存
u01316355125 分钟前
Oracle 报错:PLS-00201: 必须声明标识符‘DBMS_LOCK‘的解决方法
数据库·oracle
Awkwardx32 分钟前
MySQL数据库—MySQL数据类型
数据库·mysql
郑泰科技33 分钟前
hbase 避坑F:\hbase\hadoop\sbin>start-dfs.cmd 系统找不到文件 hadoop。
大数据·数据库·hadoop·hdfs·hbase
微爱帮监所写信寄信34 分钟前
微爱帮监狱寄信写信小程序PHP底层优化框架
java·开发语言·数据库·spring·微信·php·mybatis
郑泰科技37 分钟前
hbase避坑:Hadoop 的 NameNode 找不到指定的存储目录
数据库·hadoop·hbase