java 防重复插入_请问如何防止重复添加数据?

这些数据读远远大于写,一般编辑的的操作不是很频繁,直接从数据库中读取所有的分类没有什么问题的。但前台页面显示分类信息的时候,大量的读操作,这些分类信息最好放在缓存中,然后从缓存中读取。

难道要获取到数据库的全部分类,然后循环判断是否等于

使用select count(1) from t_classify a where a.classify_name = 'xxx' 就可以了。

如果你的分类数据有放在缓存中,可以直接从缓存取数据判断(如果用了缓存,你就要维护好缓存中的分类数据,防止脏数据。)。

很多回答者回答先判断再添加操作,这种操作还是不能保证不会重复添加的。

由于并发的存在,这种判断没有再添加的操作不能保证数据不会重复添加。判断是否有,再操作,是二步操作,不是原子性的。

举个例子:

addClassify(className){

if(!isExistInDB(className)){//如果不存在

插入分类

}

}

如果有二个用户,都进行"男装"分类的添加。

a用户,代码执行到isExistInDB,判断出没有男装,准备插入(还没有真正插入到数据库或者插入到数据库后事务还没有提交),这个时候b用户也执行到isExistInDB(),还是得到没有男装这个分类,也会插入男装分类。这样不就插入重复数据了吗!

使用如下方式防止重复添加

1:数据库悲观锁。

这种方式自己到搜搜,不推荐使用。

2:唯一索引。

分类名称上建立以为索引,每次插入商品分类,因为有唯一索引的存在,同样的商品分类数据库是禁止插入的。

3:分布式锁,如果应用是多台部署,推荐使用这种方式。分布式锁实现方式有很多种,比如使用乐观锁,使用redis去实现等等。

比如:使用分布式锁的伪码。

if(tryAcquireLock()){//如果获取锁

try{

if(!ifExist(classifyName)){

保存到数据库

}else{

抛出异常或者其他处理

}

}finally{

releaseLock();//释放锁

}

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值