并发insert情况下数据重复插入问题的解决方案

时间:2022-11-19 07:46:35

背景介绍

通常我们在接口里要保存一条数据时,会先判断该条记录在数据库里是否存在,如果不存在就插入,如果存在就返回已经存在。

就拿常见的工单来举例

Order order = orderService.getByOrderNum(ordernum);
if(order == null){
orderService.save(neworder);
}else{
msg="该工单已存在";
}

在单线程下这么写肯定没问题,但是如果是并发情况下,很有可能会同时插入多条记录进数据库。

解决方案

1.数据库设计表的时候给工单编号ordernum设计唯一性约束。

2.代码里双重检验加锁

Order order = orderService.getByOrderNum(ordernum);
if(order == null){
synchronized(lock){
Order order2 = orderService.getByOrderNum(ordernum);
if(order2 == null){
orderService.save(neworder);
} } }else{
msg="该工单已存在";
}