面对高并发扣减 / 更新 、大批量数据 、防超发 / 防覆盖 核心诉求,基于 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>
核心优势
- 性能优势 摒弃 for 循环单行 update,单 SQL 完成批量更新,大幅减少数据库交互、事务与网络损耗,千级条目毫秒执行。
- 乐观锁并发保障 关联条件绑定
版本号相等,仅当前版本匹配才执行更新;更新成功自动version+1,并发争抢时后到请求因版本不匹配更新失败,杜绝超扣、数据覆盖。 - 原子性 MySQL 单 UPDATE 语句原子执行,要么全部命中更新、要么对应行跳过,无部分更新脏数据。
补充说明
- 返回值:受影响行数 = 实际版本匹配成功的数据条数,业务可根据返回值判断部分失败、做重试处理;
- 适用场景:库存扣减、装箱数量变更等大批量、高并发数据变更场景。