转自:https://www.sojson.com/blog/288.html
html
咱们遇到挺多这样的问题,当用户并发提交数据,重复提交数据。致使数据重复,或者 Mysql SQL 报错。java
几种解决办法,对应到几种业务场景。mysql
这个应该是最多见的处理方式,是醉不安全的,由于一旦有并发其实彻底防止不了,来看看伪代码。sql
Entity entity = service.findById(10);
if(null == entity){
service.insert(obj);
}else{
service.update(obj);
}
先根据条件查询,存在就更新,不存在添加,可是每每咱们是集群、多列的状态下,会再你正在判断
jsonnull == 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'
因此咱们用到
uiREPLACE
关键字,他的做用如题,存在即更新,不存在即插入,和delete
+ Insert Into
同样。可是它一个原子操做,是一步完成,因此咱们不用担忧有其余问题的出现,可是使用REPLACE
的时候,必定要保证表有惟一主键。
重要:执行
spaREPLACE
语句后,系统返回了所影响的行数,若是返回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
转载时必须以连接形式注明原始出处及本声明。