Mysql 并发插入、存在不插入,存在更新操作

soゝso 2018-04-17 01:16:43 2912

我们遇到挺多这样的问题,当用户并发提交数据,重复提交数据。导致数据重复,或者  Mysql     SQL  报错。

几种解决办法,对应到几种业务场景。

方案一,先查再插

这个应该是最常见的处理方式,是醉不安全的,因为一旦有并发其实完全防止不了,来看看伪代码。

Entity entity = service.findById(10);
if(null == entity){
    service.insert(obj);
}else{
    service.update(obj);
}

先根据条件查询,存在就更新,不存在添加,但是往往我们是集群、多列的状态下,会再你正在判断null == entity的时候,另外一个线程已经插入完毕了,导致你以为是不存在,重复插入。

方案二,存在即更新,不存在即插入

我们平常的INSERT INTO   SQL  是这么写:

INSERT INTO demo_in(a,b,c)  VALUES(123, 2, 4);

比如C是主键,插入2次就会抛出异常:

[23000][1062] Duplicate entry '4' for key 'PRIMARY'

所以我们用到REPLACE关键字,他的作用如题,存在即更新,不存在即插入,和delete + Insert Into 一样。但是它一个原子操作,是一步完成,所以我们不用担心有其他问题的出现,但是使用REPLACE的时候,一定要保证表有唯一主键。

重要:执行REPLACE 语句后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。

 改造一下上面的语句就是:

REPLACE INTO demo_in(a,b,c)  VALUES(123, 2, 4);

方案三,存在不插入,不存在再插入

这个其实很简单,因为  Mysql  不能做到插入的时候带where条件,故用了一张临时表来处理。

INSERT INTO demo_in(a,b,c) SELECT 123, 2, 4 FROM DUAL WHERE NOT EXISTS(SELECT c FROM demo_in WHERE c = 4);

用临时表DUAL来标记数据,然后插入到demo_in表中。条件是c=4,并且not exists,也就是当c=4条件满足,则不插入。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/288.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

相关文章
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java)
Elasticsearch 件(备忘录)
Shiro对Session操作doReadSession、update频繁读取和更新问题说明
IE、Firefox对同一域名访问并发限制,及解决优化方案
Shiro教程(十一)Shiro 控制并发登录人数限制实现,登录踢出实现
Elasticsearch操作数据后马上更新的办法
Spring 静态注讲解(MethodInvokingFactoryBean)
Myecilpse,Eclipse安装Freemarker件【附件】
wangEditor 添加高亮 highlightJS
Java 送Email,Java 邮件送工具类封装
最新文章
记一次小失误导致的大事件,Mysql SQL Error: 0, SQLState: null 排查过程 36
Springboot Maven 增加本地依赖包,Springboot Maven打包本地包 79
Java 获取图片属性、获取图片EXIF属性操作方法[metadata-extractor] 39
又拍云(Upyun)CDN、云存储刷新链接缓存,API实例讲解 77
Linux Centos 使用 Redis service 启动,Redis service 脚本编写 110
恭喜SOJSON获得阿里云618“上云接力赛”第一名,获得代金券6.18万 328
Springboot 集成Freemarker 自定义标签解决方案 919
七牛云怎么样?七牛云到底有多垃圾?用七牛云需要知道的事,不然不小心就一套房没了 29336
JavaScript怎么识别360浏览器?JS识别360急速模式方案,360流氓浏览器 1236
关于本站所有JavaScript 加密、混淆、解密、美化等安全说明 2317
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 181959
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 147797
Elasticsearch教程(四) elasticsearch head 插件安装和使用 141500
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 94367
Elasticsearch教程(六) elasticsearch Client创建 82815
Elasticsearch教程(一),全程直播(小白级别) 79673
Elasticsearch教程(二),IK分词器安装 78071
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 77401
Elasticsearch教程(五) elasticsearch Mapping的创建 71306
免费天气API,天气JSON API,不限次数获取十五天的天气预报 65799

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

正在加载... ...