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

相关推荐
木易 士心7 分钟前
软考数据库系统工程师知识点详解(高频考点与备考建议)
数据库·1024程序员节
MoonBit月兔36 分钟前
MoonBit Pearls Vol.12:初探 MoonBit 中的 JavaScript 交互
开发语言·javascript·数据库·交互·moonbit
用户62799471826240 分钟前
南大通用GBase 8s JDBC 中 ROW 类型的应用
数据库
毕设源码-赖学姐1 小时前
【开题答辩全过程】以基于Hadoop的电商数据分析系统为例,包含答辩的问题和答案
大数据·hadoop·分布式·1024程序员节
wei_shuo1 小时前
平替 MongoDB 实践指南 | 金仓多模数据库助力电子证照系统国产化改造
数据库·1024程序员节·king base·金仓多模数据
best_virtuoso1 小时前
PostgreSQL ST_Intersects、ST_Crosses 和 ST_Overlaps的含义与区别
数据库·postgresql
ink@re1 小时前
消息队列集群——RabbitMQ
分布式·rabbitmq·1024程序员节
Pocker_Spades_A1 小时前
金仓多模数据库平替MongoDB的电子证照国产化实践——从2TB数据迁移到1600+并发支撑
数据库·1024程序员节
彭刷子1 小时前
《商户查询缓存案例》使用案例学习Redis的缓存使用;缓存击穿、穿透、雪崩的原理的解决方式
redis·1024程序员节