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


背景介绍

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

就拿常见的工单来举例

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="该工单已存在";  
}    

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM