优雅实现・高并发下大量数据乐观锁批量更新(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 语句原子执行,要么全部命中更新、要么对应行跳过,无部分更新脏数据。

补充说明

  • 返回值:受影响行数 = 实际版本匹配成功的数据条数,业务可根据返回值判断部分失败、做重试处理;
  • 适用场景:库存扣减、装箱数量变更等大批量、高并发数据变更场景。
复制代码
相关推荐
秋饼9 分钟前
MySQL 分库分表完全指南:ShardingSphere-JDBC 实战、分片键选型、场景边界、20 个生产坑与 30 道面试点
java·mysql·面试·shardingsphere·分库分表·后端架构
qq_452396239 分钟前
第六篇:《SQL 优化的艺术:从慢查询到毫秒级响应》
数据库·sql
ShineWinsu18 分钟前
对于Qt:QWidget通用属性的解析—上
数据库·qt·microsoft·面试·gui·属性·qwidget
程序员塔塔喵21 分钟前
【MySQL篇|第十篇】深分页问题
数据库·oracle·深分页问题
JavaPub-rodert37 分钟前
王仕宇分享:把 MySQL 排障做成 AI Agent,慢 SQL、锁等待、连接数和主从异常都能自动查
人工智能·sql·mysql
paopaokaka_luck1 小时前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
ClouGence1 小时前
SQL 效率天花板!开源 CloudDM,自带一站式 AI SQL 助手
数据库·sql·开源
Decay__1 小时前
附-01 · MySQL 压测与容量规划 —— sysbench 基准测试、容量评估与参数基线
运维·数据库·sql·mysql·架构
这个DBA有点耶2 小时前
主从切换报成功,业务却写不进去——数据层脑裂与应用层连接残留的两类假成功
数据库·架构·dba
qq_452396232 小时前
第八篇:《VACUUM、自动清理与膨胀治理》
jvm·数据库·oracle