当前位置: 首页 > news >正文

利用无事务方式插入数据库解决并发插入问题(最小主键id思路)

一、背景

由于某业务需要回退某产品数据缓存列表Asset资源,主任务执行后,通过并行执行批量子任务进行数据回退,子任务中会记录缓存列表Asset和缓存列表行AssetLine数据,并行执行过程会出现缓存列表行AssetLine重复插入问题,导致后续业务执行变更资源时候报错。

以前写过一篇也是利用无事务方式解决并发问题,主要是通过获取插入后的自增主键id,防止并发场景,再次查询一次,如果id一致,则代表插入成功,如果id不一致,则代表插入失败,删除这条旧数据。利用无事务方式插入数据库解决并发插入问题,本文通过另一种思路无事务解决并发插入数据库,数据重复问题。

二、方案实现

1.先根据id查询数据库中是否存在该数据,如果存在则代表已经插入过了,直接返回
2.如果不存在此条数据,插入数据库
3.获取插入后的自增主键id,查询SQL倒序desc排序
4.防止并发场景,再次查询一次,
查询出来的数据是按照id倒序,最后1条id最小。
如果id最小的不是当前插入的id,表示当前入库之前已经有数据入库,需要失效当前数据,
然后取id最小的那1条作为有效数据。

伪代码实现

// 当前需要插入的数据
AssetLine needAddAssetLine;
// 根据assetId查询当前数据
Lisst<AssetLine> assetLineList = findByAssetId(assetId);
Optional<AssetLine> minIdVo = assetLineList.stream().min(Comparator.comparing(AssetLine::getId));
if(minIdVo.isPresent()){AssetLine  minIdAssetLine = minIdVo.get();if(needAddAssetLine.getId() != minIdAssetLine.getId()){//失效需要新增的数据 int count = updateByAssetId(needAddAssetLine.getId());if(count != 0){needAddAssetLine.setId(minIdAssetLine.getId());}}
}
http://www.lryc.cn/news/626365.html

相关文章:

  • Oracle官方文档翻译《Database Concepts 23ai》第2章-容器数据库与可插入数据库
  • day31 SQLITE
  • [特殊字符] 从文件到视频:日常数据修复全攻略
  • 零基础数据结构与算法——第八章 算法面试准备-小结
  • 发布策略制定与优化:五维立体降风险与三层AI提示词实战
  • 基于Python的反诈知识科普平台 Python+Django+Vue.js
  • 前端-JavaScript笔记(核心语法)
  • 单片机学习---字节对齐
  • PCL+Spigot服务器+python进行MC编程2(使用RCON)---可以生成角色
  • week3-[分支结构]2023
  • WAF能防御哪些Web攻击?
  • AI出题人给出的Java后端面经(二十)(日更)
  • GB 45672-2025《车载事故紧急呼叫系统》标准发布对蜂窝模组企业带来新的增加空间
  • AI时代SEO关键词优化新策略
  • 【NFTurbo】基于Redisson滑动窗口实现验证码发送限流
  • CentOS7 离线一键安装 MySQL 8.0
  • SpringBoot前后端token自动续期方案
  • nginx-下载功能-状态统计-访问控制
  • 开源的实时 Web 日志分析器GoAccess安装使用指南
  • 鸿蒙安卓前端中加载丢帧:ArkWeb分析
  • Vue3全局配置Loading的完整指南:从基础到实战
  • electron进程间通信-从主进程到渲染器进程
  • PyTorch API 3 - distributed
  • 实时视频技术选型深度解析:RTSP、RTMP 与 WebRTC 的边界
  • SpringWeb详解
  • Causal-Copilot: An Autonomous Causal Analysis Agent 论文解读
  • Nginx 作为反向代理时设置的请求头
  • 深度解析:RESTful API中的404错误 - 不是所有404都是Bug
  • 安路EF2系列芯片单口ram ip核使用方法
  • 记录 docker容器打包成镜像 在其他服务器快速启动镜像和容器