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

JSON 2018-04-17 01:16:43 21456

我们遇到挺多这样的问题,当用户并发提交数据,重复提交数据。导致数据重复,或者  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)
MySQL器教程
MySQL器教程
Myecilpse,Eclipse安装Freemarker件【附件】
wangEditor 添加高亮 highlightJS
Elasticsearch教程 ,Elasticsearch count 查询,Elasticsearch 查询是否存在
Elasticsearch教程(四) elasticsearch head 件安装和使用
Spring 静态注讲解(MethodInvokingFactoryBean)
怎么防止sql注
IE、Firefox对同一域名访问并发限制,及解决优化方案
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

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

查看我的收藏

正在加载... ...