温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis如何乐观锁

发布时间:2026-09-23 07:29:33 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

在 MyBatis(含 MyBatis‑Plus) 中,实现 乐观锁(Optimistic Lock) 的核心思想是:

更新时带上“版本号 / 时间戳”,只有版本匹配才允许更新,否则失败。

下面分 两种常见方式 讲:
✅ MyBatis‑Plus(推荐,最简单)
✅ 原生 MyBatis(自己写 SQL)


一、MyBatis‑Plus 乐观锁(推荐 ✅)

1️⃣ 表中加版本字段

ALTER TABLE user ADD COLUMN version INT DEFAULT 0;

2️⃣ 实体类加 @Version

@Data
@TableName("user")
public class User {

    private Long id;
    private String name;

    @Version
    private Integer version;
}

3️⃣ 配置乐观锁插件

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

4️⃣ 使用方式(自动生效)

User user = userMapper.selectById(1L);
user.setName("张三");

// 自动:UPDATE user SET name=?, version=version+1 WHERE id=? AND version=?
userMapper.updateById(user);

✅ 并发场景:

  • A 先读 version=1
  • B 先更新 version=2
  • A 再更新 → WHERE version=1 不匹配 → 更新失败(影响行数 0)

二、原生 MyBatis 实现乐观锁

1️⃣ 表结构

CREATE TABLE user (
  id BIGINT PRIMARY KEY,
  name VARCHAR(50),
  version INT
);

2️⃣ Mapper 接口

int updateUser(User user);

3️⃣ XML 中写乐观锁 SQL

<update id="updateUser">
  UPDATE user
  SET name = #{name},
      version = version + 1
  WHERE id = #{id}
    AND version = #{version}
</update>

4️⃣ Java 代码

User user = userMapper.selectById(1L);

// 模拟并发修改
user.setName("新名字");

int rows = userMapper.updateUser(user);
if (rows == 0) {
    throw new RuntimeException("更新失败,数据已被修改");
}

三、乐观锁 vs 悲观锁

对比项 乐观锁 悲观锁
实现 version / timestamp SELECT ... FOR UPDATE
性能 ✅ 高 ❌ 低
适用 读多写少 写冲突频繁

四、常见坑 ⚠️

  1. version 必须是查出来的,不能自己 new
  2. 更新失败要业务处理(重试 or 提示)
  3. 批量更新时 MyBatis‑Plus 默认不支持乐观锁
  4. version 类型建议 Integer / Long

如果你愿意,我可以:

  • 给你一个 Spring Boot 完整 Demo
  • 讲 乐观锁 + 重试机制
  • 讲 分布式场景下的乐观锁问题

你现在是 MyBatis 还是 MyBatis‑Plus?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手