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

利用无事务方式插入数据库解决并发插入问题(最小主键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.xdnf.cn/news/18326.html

相关文章:

  • idea进阶技能掌握, 自带HTTP测试工具HTTP client使用方法详解,完全可替代PostMan
  • 暖哇科技AI调查智能体上线,引领保险调查风控智能化升级
  • 【数据结构】排序算法全解析:概念与接口
  • RK android14 Setting一级菜单IR遥控器无法聚焦问题解决方法
  • Apache ShenYu和Nacos之间的通信原理
  • VPS海外节点性能监控全攻略:从基础配置到高级优化
  • Android 入门到实战(三):ViewPager及ViewPager2多页面布局
  • 数据预处理学习心得:从理论到实践的桥梁搭建
  • 比剪映更轻量!SolveigMM 视频无损剪切实战体验
  • 29.Linux rsync+inotify解决同步数据实时性
  • 3D检测笔记:相机模型与坐标变换
  • 详解 scikit-learn 数据预处理工具:从理论到实践
  • CS+ for CC编译超慢的问题该如何解决
  • Day23 双向链表
  • 计算机网络--HTTP协议
  • 亚马逊新品爆单策略:从传统困境到智能突破
  • 【Grafana】grafana-image-renderer配合python脚本实现仪表盘导出pdf
  • 给你的Unity编辑器添加实现类似 Odin 的 条件显示字段 (ShowIf/HideIf) 功能
  • word——如何给封面、目录、摘要、正文设置不同的页码
  • 路由器NAT的类型测定
  • vue:vue中的ref和reactive
  • 【LLMs篇】18:基于EasyR1的Qwen2.5-VL GRPO训练
  • 层在init中只为创建线性层,forward的对线性层中间加非线性运算。且分层定义是为了把原本一长个代码的初始化和运算放到一个组合中。
  • 机械革命电竞控制台一直加载无法点击故障
  • MySQL事务及原理详解
  • 牛津大学xDeepMind 自然语言处理(3)
  • 工业电脑选得好生产效率节节高稳定可靠之选
  • C/C++ 与嵌入式岗位常见笔试题详解
  • Mac电脑上虚拟机共享文件夹权限问题
  • vscode连接docker