增加了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

相关推荐
m0_587383001 小时前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
Y3815326621 小时前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
骑着蜗牛撵大象3271 小时前
SQL 编辑器不是高级记事本:KStudio 与 KSQL Developer 里的建表与增删改查手法
数据库·sql·mysql·编辑器·crud·执行计划
SparklingTheo1 小时前
【Zookeeper】源码阅读
分布式·zookeeper·云原生
Access开发易登软件1 小时前
我全新开发了一套 Access 通用 Excel 导入工具,现在开源了
数据库·microsoft·excel·mfc·vba·access·access开发
笃行3501 小时前
SQL编辑器的隐藏技能:KingbaseES 配套 KSQL Developer 使用笔记
数据库
努力进修2 小时前
时序数据长期承载难题:从压缩、批量写入到数据组织优化
java·开发语言·数据库
CaptainT2 小时前
先把例子跑起来:MySQL 环境与本文的示例数据
数据库·后端·mysql
Dovis(誓平步青云)2 小时前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
xiaogai_gai2 小时前
电商采购入库对接财务VMI采购入库(单号回写)实战教程
大数据·数据库