背景介绍
通常我们在接口里要保存一条数据时,会先判断该条记录在数据库里是否存在,如果不存在就插入,如果存在就返回已经存在。
就拿常见的工单来举例
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="该工单已存在"; }