优雅实现・高并发下大量数据乐观锁批量更新(MySQL 最优实践)

面对高并发扣减 / 更新大批量数据防超发 / 防覆盖 核心诉求,基于 MySQL + MyBatis 实现高性能 + 原子性 + 版本号严格控制的乐观锁批量更新,拒绝单行循环、杜绝并发冲突。

xml

复制代码
<update id="batchUpdateByVersion">
    UPDATE biz_table t
    INNER JOIN (
        <foreach collection="list" item="item" separator=" UNION ALL ">
            SELECT
                #{item.id} AS id,
                #{item.version} AS old_ver,
                #{item.num} AS target_num
        </foreach>
    ) v ON t.id = v.id AND t.version = v.old_ver
    SET 
        t.biz_num = v.target_num,
        t.version = t.version + 1
    WHERE t.deleted = 0 AND t.biz_id = #{bizId}
</update>

核心优势

  1. 性能优势 摒弃 for 循环单行 update,单 SQL 完成批量更新,大幅减少数据库交互、事务与网络损耗,千级条目毫秒执行。
  2. 乐观锁并发保障 关联条件绑定版本号相等,仅当前版本匹配才执行更新;更新成功自动version+1,并发争抢时后到请求因版本不匹配更新失败,杜绝超扣、数据覆盖。
  3. 原子性 MySQL 单 UPDATE 语句原子执行,要么全部命中更新、要么对应行跳过,无部分更新脏数据。

补充说明

  • 返回值:受影响行数 = 实际版本匹配成功的数据条数,业务可根据返回值判断部分失败、做重试处理;
  • 适用场景:库存扣减、装箱数量变更等大批量、高并发数据变更场景。
复制代码
相关推荐
这个DBA有点耶40 分钟前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea1 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
默 语2 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
probex_2 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库
用户3074596982072 小时前
MySQL EXPLAIN 零基础完全精通指南:从"看不懂"到"会优化"
mysql
Patrick在香港2 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
这个DBA有点耶2 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析
数据库·mysql·代码规范
迷茫的大专生3 小时前
高可用总结
redis·mysql·nginx·高可用
老纪的技术唠嗑局3 小时前
Agent 习惯性删库跑路,数据库纷纷学 Git 续命
数据库·人工智能
Data_Journal3 小时前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy