并发insert情况下数据重复插⼊问题的解决⽅案
背景介绍
通常我们在接⼝⾥要保存⼀条数据时,会先判断该条记录在数据库⾥是否存在,如果不存在就插⼊,如果存在就返回已经存在。就拿常见的⼯单来举例
Order order = ByOrderNum(ordernum);
if(order == null){
insert的固定搭配orderService.save(neworder);
}else{
msg="该⼯单已存在";
}
在单线程下这么写肯定没问题,但是如果是并发情况下,很有可能会同时插⼊多条记录进数据库。
解决⽅案
1.数据库设计表的时候给⼯单编号ordernum设计唯⼀性约束。
2.代码⾥双重检验加锁
Order order = ByOrderNum(ordernum);
if(order == null){
synchronized(lock){
Order order2 = ByOrderNum(ordernum);
if(order2 == null){
orderService.save(neworder);
}
}
}else{
msg="该⼯单已存在";
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论