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

UPSERT并发竞争下的「幽灵ID」脏数据

前言

线上遇到一类隐蔽生产故障:程序运行无报错、事务正常提交,却源源不断产生僵尸脏数据。

当两个事务并发对同一业务单号执行UPSERT时,其中一个事务会被唯一索引排他记录锁阻塞;被阻塞的事务唤醒后,因唯一键冲突降级执行UPDATE,不会新增主表数据。

依托MyBatis-Plus雪花ID策略,实体提前在内存生成主键,若下游直接使用这个ID创建子记录,就会出现子表有数据、主表无匹配记录的「幽灵ID」脏数据。

环境说明

MySQL InnoDB,RC、RR隔离级别均会复现;

业务单号建立唯一索引;并发事务均使用UPSERT写入;

主键策略:使用 IdType.ASSIGN_ID (雪花算法)。

完整并发执行时序

1. 事务A、事务B同时处理同一业务单号 a ,执行UPSERT;

2. MP在SQL执行前,分别为两个实体在内存预生成独立雪花ID;

3. 事务A率先抢占唯一索引排他记录锁,执行SQL,事务尚未提交;

4. 事务B检测到锁冲突,进入阻塞等待。(备注:RC、RR隔离级别下,事务B均无法读取事务A未提交的数据,因此预先查询判断业务单号 a 是否存在无法规避该并发问题);

5. 事务A执行commit,数据成功写入数据库;

6. 事务B被MySQL唤醒,再次校验唯一索引,发现单号 a 已存在;

7. 事务B进入UPDATE分支,仅更新已有记录,不会新增主表行。


幽灵ID产生核心原理

雪花ID由应用内存提前生成,和数据库执行结果无关。

即便UPSERT最终走入更新分支,没有插入新数据,实体对象依旧保留预先生成的雪花ID。

业务代码直接读取实体ID,用于新增明细、流水等子记录。

结果:事务B携带的雪花ID仅存在于JVM内存,数据库不存在该主键,也就是幽灵ID,最终滋生大量悬浮子表脏数据。


补充:IdType.AUTO 自增主键在UPSERT下的表现

自增主键行为和雪花ID有明显区别:

1. 常规写法:新建实体 id=null 。UPSERT进入UPDATE分支时,无法回调主键,实体ID维持null。只要代码增加ID非空判断,就能规避脏数据;

2. 危险写法:代码手动提前 setId() 设置占位ID。更新分支不会覆盖实体属性,占位ID保留,同样会生成幽灵ID。

整体来看,自增主键默认场景风险更低,但并非绝对安全。


生产级解决方案

1. UPSERT执行完成后,禁止直接使用实体内的主键。必须根据唯一键业务单号重新查询数据库,拿到真实持久化主键;

2. 校验UPSERT执行影响行数

int affectRows = mapper.upsert(entity); // 返回1:新增成功;返回2:冲突更新,禁止使用当前实体主键关联子数据

3. 针对业务唯一单号增加分布式锁,保证同一单号串行执行,从源头消除并发争抢;

4. 核心主数据业务不要无脑滥用UPSERT,可拆分新增、更新逻辑。


总结

同一唯一键并发UPSERT时,被锁阻塞的事务最终降级执行更新、不会新增主表记录。

雪花算法 IdType.ASSIGN_ID 预先在内存生成主键,极易诞生幽灵ID,是高频风险点;

自增主键 IdType.AUTO 仅在手动赋值实体ID的特殊场景下会踩坑。

http://www.jsqmd.com/news/1310879/

相关文章:

  • AI智能体系统化调试:从可观测性到诊断修复的工程实践
  • 从 SSH 端口转发到 kcptun UDP 加速:被墙后的网络优化全流程实战
  • 2026 年新消息:邵东比较好的厂区物料周转车实力厂家选哪家,车间里总乱堆?这台帮你把物料跑得飞起的玩意儿究竟是什么? - 行业甄选官
  • Windows无线网卡MAC地址修改:原理、方法与实战指南
  • UniApp Android全面屏适配:实现底部导航栏沉浸式透明效果
  • 考研调剂全攻略:新疆财经大学管理科学与工程调剂解析与实战指南
  • ZigBee协议解析:从低功耗网状网络到智能家居稳定组网实战
  • SCSE注意力机制:双路径特征校准在CNN中的原理与PyTorch实现
  • DP1.2硬件规范深度解析与联想设备兼容性实战指南
  • 2026 年现阶段,大祥专业的场地围栏网厂商格局重塑与选型新思路,这些地方还在裸奔?难怪事故频发得吓人!-博才金属网业 - 企业信息推荐【官方】
  • 写了个脚本,把BBR安装切换与配置放在一起管理
  • 2026 年现阶段哈巴河有实力的空气能采暖安装源头厂家深度解析,花几千块装这玩意儿,竟比烧煤还省一半钱? - 行业推荐【认证官】
  • 2026泰安活动拍摄公司排行榜TOP5 | 会议拍摄 | 活动跟拍 | 视频直播 | 照片直播 | 年会拍摄服务商评测对比 - 政企影像扫地僧
  • 2026 年当下,庆阳热门的新能源电车托运企业哪个好,把车跨城运回老家,选对方式能省出大半个保养费,这事儿你得懂点门道?-盛世华航轿车托运 - 领域鉴赏官
  • 大功率液冷PCS散热路径设计与温升仿真实操要点
  • Spring Cloud Alibaba Sentinel实战:从零构建微服务流量防线与Nacos规则持久化
  • 3分钟批量获取网易云和QQ音乐歌词:163MusicLyrics终极指南
  • 150平新中式庭院怎么配比不显挤?2026年这5条尺度法则要记牢
  • 2026年WordPress商城主题推荐
  • 2026 年现阶段,叶城口碑好的防护网供货厂家推荐,高层住户没装这玩意儿,出事才追悔莫及! - 行业甄选官
  • 从模糊需求到清晰方案:SQL窗口函数实现数据百分位排名与等级划分
  • 深入解析GD32H7定时器通道控制寄存器:输出比较与输入捕获实战
  • 2026 年新发布:涡阳口碑好的高压洗碗机订做厂家哪家强,碗碟上的陈年老垢,它三分钟就能冲干净?-东泰洗碗机 - 行业推荐官【认证】
  • 大模型知识科普——多模态大模型原理:文本、图像与音频如何统一理解?
  • 2026乐山企业宣传片制作公司排行榜TOP5 | 品牌形象片 | 产品宣传片 | 招商宣传片 | TVC广告 | 企业年会片服务商评测对比 - 政企影像扫地僧
  • 2026盘点:巴南优质纯粮酒工厂哪家好——从原料到工艺的深度甄选 - 装修教育财税推荐2026
  • 游戏模组制作实战:从脚本修改到武器配置的完整指南
  • BloodHound实战指南:内网渗透测试中的关系图谱分析与攻击路径发现
  • Nginx user指令警告解析:进程模型、权限配置与安全实践
  • AI输入法技术解析:从语音识别到智能写作的范式革命