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

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

使用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();//释放锁

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐