写在前面

项目使用SpringBoot的多实例微服务

层级调用Controller -->Service-->Dao或者Mapper(Mybatis)

具体问题和解决方案

最近在做一个模块的时候,有一个新增接口可能存在重复插入的问题

QA人为模拟两个人同时操作,具体做法是用两个手机登录同一个界面同时操作,这样就造成了重复插入,

在数据库层面,为了避免重复数据,我们可以建立唯一索引,但建立唯一索引后,程序就会抛出唯一性异常,需要捕获处理

因为是多实例(即部署多个节点)的微服务,所以解决重复问题不能用同步锁、局部锁(RetreenLock)的方式来处理,所以就考虑用分布式锁,因为项目中即成了Redis,所以第一个想到的就是用Redis分布式锁来处理,也确实解决了问题。

那么需要注意的点是:

1、在Service实现类中,不能将查询和新增操作放在同一个方法中,因为同一个方法在同一个事务中,比如下面的模拟代码:

@Transactional
public List<对象> test(){//其他代码省略。。。save(新增插入数据库操作)return select(查询刚新增的数据)}

上面这段代码的问题是,新增和查询都在一个方法中,只有方法之行完成后,事务才会真正的提交,那么在方法中查询到的数据很可能就是没提交过数据前的数据,所以查询出来的结果就是不对的

那么正确的做法就是将save(新增)实现和select(查询实现)放在不同的方法中,在Controller层去分别调用,这样查询数据就能查到最新新增的数据,因为事务已经提交了

Controller层,将新增方法上锁,这里用到的是redis分布式锁,实现起来也非常的简单,但实用:

RLock lock = redissonClient.getLock(key);
try {
    lock.lock();

可以在这里做个简单的查询

save(新增实现)

}finally{

lock.unlock();

}

然后在查询数据就能查询到最新保存的数据了,因为事务已经提交了

这样就搞定了

当然也可以用其他的分布式锁,比如创建Zookeeper的临时节点来作为锁,

这里不太推荐用数据库锁,除非数据量非常小,用户量也少,操作不频繁。

新增数据并发处理,避免重复数据插入相关推荐

  1. MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据

    MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据 目录导航: 开发背景: 实战: 表结构如下图所示: 操作: 总结: 回到顶部 开发背景: 最近在做一个批量数据导入到MySQL数据 ...

  2. python去重复的数据_Python中mysql查询重复数据并删除重复数据

    #coding:utf-8 import mysql.connector mydb = mysql.connector.connect( host='localhost', user='root', ...

  3. cdatabase读取excel第一行数据_pandas读取excel数据并对重复数据进行标记或者删除

    pandas读取excel数据并对重复数据进行标记或者删除​mp.weixin.qq.com pandas通常在读取excel数据之后,如果需要进行去重,有两种方式,一种是进行标记,另一种是在pand ...

  4. C# SqlBulkCopy 避免插入重复数据(不重复即插入)

    之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法. 这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入, ...

  5. python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...

    1. 数据文件 2. 读数据 import pandas as pd data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv') print(data ...

  6. list循环添加数据_List 去除重复数据的 5 种正确姿势!你知道几种?

    喜欢就关注我们吧! 以下介绍五种不同的方法去除 Java 中ArrayList中的重复数据. 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个A ...

  7. SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...

    --表之间数据复制 SELECT* INTO yozhu FROM yo --复制一份表 SELECT* INTO yozhu1 FROM yo where 1<>1 --只复制表结构,无 ...

  8. java list过滤重复的数据_List 去除重复数据的 5 种正确姿势!

    以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除 ...

  9. pandas读取excel数据并对重复数据进行标记或者删除

    pandas通常在读取excel数据之后,如果需要进行去重,有两种方式,一种是进行标记,另一种是在pandas中直接去重 如下图所示,excel数据: (1)使用drop_duplicates(sub ...

  10. mysql类似于excel的删除重复项_删除重复数据 excel去除重复数据 怎么筛选重复数据 excel重复数据合并...

    本篇文章主要介绍了"删除重复数据",主要涉及到重复数据方面的内容,对于MySql感兴趣的同学可以参考一下: 最近因为发现数据库中的表有脏数据,需要维护.这些脏数据就是重复数据,需要 ...

最新文章

  1. POJ 1273 Drainage Ditches
  2. ATMEGA8 DIP-28面包板实验
  3. ubuntu下安装wine
  4. 乘基取整法是什么_十进制小数转二进制小数乘2取整法的直观理解
  5. vue实现下拉列表远程搜索示例(根据关键词模糊搜索)
  6. 【js】数组置空的其他方式及使用场景
  7. CSS单行文本溢出显示省略号(…)
  8. 再也不用等待tomcat慢慢下载
  9. 非科班程序员如何逆袭?
  10. Unity的Frame Debugger
  11. Oracle 数据库修复,IBM DB2 数据库修复,MY SQL 数据库修复,SQL Server 数据 库修复,Sybase 数据库,Foxpro 数据库,Access 数据库,Informi
  12. 笔记本电脑蓝牙搜索不到设备
  13. 服装制图软件测试初学者,服装行业版软件测试方案.ppt
  14. 数据库学习纪要(十二):SQL Sever介绍-4
  15. 关于msp430的BSL下载
  16. 咖啡豆是怎么生产出来的
  17. TryHackMe学习笔记-Windows PrivEsc Arena
  18. 百度CEO李彦宏在毕业二十周年之际受邀重回母校
  19. Fedora 7安装和配置
  20. mac 上开发常用的软件强烈推荐

热门文章

  1. mysql修改重复数据You can‘t specify target table ‘‘ for update in FROM clause
  2. 批量将swa文件转成MP3文件
  3. 仿豆瓣(静态web布局)(全)
  4. 利用云开发+Vant-Weapp开发的校园二手交易小程序
  5. Anaconda 安装python第三方库的各类方法
  6. 人工智能时代八大类算法你了解吗?(文末包邮送书6本)
  7. KOA2项目简单搭建
  8. 「法拉第的故事」读后心得
  9. 基于云的先进计划与调度系统的框架与部署
  10. 电脑读不出u盘解决办法