当前位置: 首页 > 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.dtcms.com/a/340259.html

相关文章:

  • 海外短剧app、h5、独立站、国内短剧看广告app,短剧小程序、源码交付开发
  • java17学习笔记
  • RK android14 Setting一级菜单IR遥控器无法聚焦问题解决方法
  • VPS海外节点性能监控全攻略:从基础配置到高级优化
  • 02-docker相关知识
  • Java 学习笔记(基础篇6)
  • 29.Linux rsync+inotify解决同步数据实时性
  • 【Tech Arch】Apache HBase分布式 NoSQL 数据库
  • 签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
  • 微服务自动注册到ShenYu网关配置详解
  • mysql数据恢复
  • WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • 2.Shell脚本修炼手册之---创建第一个 Shell 脚本
  • Windows 11 安装 Miniconda + Mamba,配置国内源
  • KV cache
  • java八股文-JVM相关面试题-参考回答
  • 计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架
  • 机器学习--数据清洗—(续篇)
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Python文件操作与异常处理详解 :基础方法、注意事项及os模块常用功能
  • day31 SQLITE
  • 百度Q2财报:总营收327亿 AI新业务收入首次超100亿
  • 前端-JavaScript笔记(核心语法)
  • Go语言数据类型全解析
  • 线程安全的产生以及解决方案
  • 记一次pnpm start启动异常
  • 学习设计模式《二十三》——桥接模式
  • 算法实战入门第二篇:链表结构与五大经典应用
  • 如何制作免费的比特币冷钱包