当前位置:   article > 正文

mysql 并发 重复写入_并发insert情况下会发生重复的数据插入问题

mysql并发写入重复数据

1.背景

用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;

如果没有存在,那么执行insert操作代码逻辑:

if(oderid != null){//该记录已存在

update();

}else{//写入记录

insert();

}

线程启动后,发现:数据库表中有两条oderid相同的记录

通过查看日志发现:

两个线程相差时间极端,各自收到了同一个订单的推送消息,在执行数据库insert或update时,都判断出该订单在数据库表中不存在,所以都执行insert操作,造成数据库表中有两条orderid相同的记录

2.解决方案

synchronized同步代码块即加同步锁,synchronized同步代码块的功能:

1)、当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分

2)、当A线程进入对象的synchronized代码块的时候,B线程如果要访问这段synchronized块,那么访问将会被阻塞

if(oderid != null){//该记录已存在

update();

}else{synchronized(this){if(oderid != null){//该记录已存在

update();

}else{

insert();

}

}

<
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号