新增数据并发处理,避免重复数据插入
写在前面
项目使用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的临时节点来作为锁,
这里不太推荐用数据库锁,除非数据量非常小,用户量也少,操作不频繁。
新增数据并发处理,避免重复数据插入相关推荐
- MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据 目录导航: 开发背景: 实战: 表结构如下图所示: 操作: 总结: 回到顶部 开发背景: 最近在做一个批量数据导入到MySQL数据 ...
- python去重复的数据_Python中mysql查询重复数据并删除重复数据
#coding:utf-8 import mysql.connector mydb = mysql.connector.connect( host='localhost', user='root', ...
- cdatabase读取excel第一行数据_pandas读取excel数据并对重复数据进行标记或者删除
pandas读取excel数据并对重复数据进行标记或者删除mp.weixin.qq.com pandas通常在读取excel数据之后,如果需要进行去重,有两种方式,一种是进行标记,另一种是在pand ...
- C# SqlBulkCopy 避免插入重复数据(不重复即插入)
之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法. 这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入, ...
- python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...
1. 数据文件 2. 读数据 import pandas as pd data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv') print(data ...
- list循环添加数据_List 去除重复数据的 5 种正确姿势!你知道几种?
喜欢就关注我们吧! 以下介绍五种不同的方法去除 Java 中ArrayList中的重复数据. 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个A ...
- SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...
--表之间数据复制 SELECT* INTO yozhu FROM yo --复制一份表 SELECT* INTO yozhu1 FROM yo where 1<>1 --只复制表结构,无 ...
- java list过滤重复的数据_List 去除重复数据的 5 种正确姿势!
以下介绍五种-不同的方法去除 Java 中ArrayList中的重复数据 1.使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除 ...
- pandas读取excel数据并对重复数据进行标记或者删除
pandas通常在读取excel数据之后,如果需要进行去重,有两种方式,一种是进行标记,另一种是在pandas中直接去重 如下图所示,excel数据: (1)使用drop_duplicates(sub ...
- mysql类似于excel的删除重复项_删除重复数据 excel去除重复数据 怎么筛选重复数据 excel重复数据合并...
本篇文章主要介绍了"删除重复数据",主要涉及到重复数据方面的内容,对于MySql感兴趣的同学可以参考一下: 最近因为发现数据库中的表有脏数据,需要维护.这些脏数据就是重复数据,需要 ...
最新文章
- POJ 1273 Drainage Ditches
- ATMEGA8 DIP-28面包板实验
- ubuntu下安装wine
- 乘基取整法是什么_十进制小数转二进制小数乘2取整法的直观理解
- vue实现下拉列表远程搜索示例(根据关键词模糊搜索)
- 【js】数组置空的其他方式及使用场景
- CSS单行文本溢出显示省略号(…)
- 再也不用等待tomcat慢慢下载
- 非科班程序员如何逆袭?
- Unity的Frame Debugger
- Oracle 数据库修复,IBM DB2 数据库修复,MY SQL 数据库修复,SQL Server 数据 库修复,Sybase 数据库,Foxpro 数据库,Access 数据库,Informi
- 笔记本电脑蓝牙搜索不到设备
- 服装制图软件测试初学者,服装行业版软件测试方案.ppt
- 数据库学习纪要(十二):SQL Sever介绍-4
- 关于msp430的BSL下载
- 咖啡豆是怎么生产出来的
- TryHackMe学习笔记-Windows PrivEsc Arena
- 百度CEO李彦宏在毕业二十周年之际受邀重回母校
- Fedora 7安装和配置
- mac 上开发常用的软件强烈推荐