并发入库面临重复数据的问题

以User类为例,当添加一个用户时,首先会去判断用户是否已经存在(即username是否已经在数据库中了),如果没有,则insert一条用户数据,如果有,则提示用户名已存在。

将这个操作看作函数:UserService.saveUser(User user),有3个步骤:

private int saveUser(User user) {  if (1.username不存在) {// 2.入库;} else {// 3.提示用户名已存在;}}

这个saveUser函数实际上是线程不安全的,假设两个线程A和线程B,两个线程同时进行了判断(步骤1),发现username不存在,那么就会导致user表中插入了两个username一样的数据(步骤2)。

解决方案一

最直接的,通过添加synchronized关键字,将方法变成同步方法

优点:简单直接

缺点:性能问题;后期的维护成本较高;最终要的,当服务部署在多台设备时不起作用


解决方案二

在数据库的user表中,将username字段设为唯一索引,这样当插入重复数据时,数据库会抛出异常,无法入库,可以通过异常处理的方式来处理

优点:从比较根源的数据库层面解决了问题,适用与分布式环境

缺点:需要关注异常处理

转载于:https://www.cnblogs.com/shiyu404/p/8480649.html

并发入库面临重复数据的问题相关推荐

  1. mysql 并发避免锁表_Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+MYSQL锁表防止并发情况下重复数据的方法.分享给大家供大家参考,具体如下: lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从 ...

  2. 并发产生mysql锁表_Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+MYSQL锁表防止并发情况下重复数据的方法.分享给大家供大家参考,具体如下: lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从 ...

  3. PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳。在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据。即使使用了第二个参数,也会重复,最好的方案是结

    转载地址:http://www.51-n.com/t-4264-1-1.html PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环 ...

  4. 利用Redis解决重复数据时候的并发异常和分布式锁解决方案

    最近公司里有一个并发业务.多个线程消费一个kafka数据流,这个kafka数据流里数据的某个字段有重复.需要根据这个字段来做下去重. 一开始的方案是利用Redis来实现,先查Redis如果没有的话则s ...

  5. 多线程之:并发编程面临的挑战

    一:并发编程面临的挑战 (1)上下文切换问题 (2)死锁问题 (3)受限于硬件和软件资源的问题 &&注意点:并发编程的累加操作不超过百万次,多线程的执行速度要比单线程慢.因为线程有创建 ...

  6. 线程同步工具(七)在并发任务间交换数据

    声明:本文是< Java 7 Concurrency Cookbook >的第三章, 作者: Javier Fernández González 译者:郑玉婷 在并发任务间交换数据 Jav ...

  7. wpf文本框限制输入长度_Excel办公实操,限制输入日期,手机号码,不重复数据的使用...

    限制只能输入当前日期之前的日期 图是某企业的入库登记表,用来登记不同日期各品名和型号的入库信息.其中A列是产品入库的日期,要求必须为当前日期之前的日期,为了防止工作人员将入库日期输入为当天以后的日期, ...

  8. 明明加了唯一索引,为什么还是产生重复数据?

    前言 前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了. 到底怎么回事呢? 本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点. 1.还 ...

  9. 农村土地确权之数据入库 —— 苍穹软件数据入库说明

    想要获取更多关于土地确权的专业知识,可加入土地确权专业交流群(256956756). 1. 四个信息表的数据整理 (1)发包方信息表 Ø  发包方编码(14位)及发包方名称:严格按照<一标段发包 ...

最新文章

  1. Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器
  2. python协程库_python中协程的详解(附示例)
  3. JVM—如何利用虚拟机栈进行函数调用?
  4. spring cloud 总结
  5. 信息安全工程师笔记-国产密码算法(国密)概念
  6. java innodb存储引擎_MySQL InnoDB存储引擎的事务隔离级别
  7. while循环(包含死循环、while嵌套)
  8. k8s service type_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷...
  9. IntelliJ IDEA导入maven项目
  10. iOS SDK 介绍及导入
  11. linux全局查找-find,locate,whereis,which,type区别
  12. 重新认识下科技核心目录吧!附容易发的期刊名单
  13. pycharm汉化包
  14. 深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .
  15. Spring中AOP及ReflectiveMethodInvocation逻辑简析
  16. Windows错误、问题汇总
  17. js浏览器的打印和去除页眉和页脚
  18. 山东地炼汽柴油今日价格表查询,山东地炼8月15日成品油价分析
  19. 双X轴的Echarts图
  20. workerman入门之GatewayWorker的使用

热门文章

  1. 梯度消失和梯度爆炸_梯度消失和梯度爆炸详解
  2. python 乘法内置函数_Python内置函数--reversed()
  3. Java常用算法三:01背包问题
  4. 2013蓝桥杯C++B:高斯日记;马虎的算式(2种解法)
  5. bzoj 1662: [Usaco2006 Nov]Round Numbers 圆环数(枚举)
  6. opencv 图像傅里叶变换
  7. jquery表单选择器input、:text、:password、:radio、:checkbox、:submit、:reset、:image、:button、:file、:hidden
  8. 均方根误差RMSE(Root Mean Square Error)
  9. 计算机操作视频及运用方式,电脑上可以使用什么方法来编辑、制作视频?
  10. 浅谈sql之连接查询