在 MyBatis(含 MyBatis‑Plus) 中,实现 乐观锁(Optimistic Lock) 的核心思想是:
更新时带上“版本号 / 时间戳”,只有版本匹配才允许更新,否则失败。
下面分 两种常见方式 讲:
✅ MyBatis‑Plus(推荐,最简单)
✅ 原生 MyBatis(自己写 SQL)
ALTER TABLE user ADD COLUMN version INT DEFAULT 0;
@Version@Data
@TableName("user")
public class User {
private Long id;
private String name;
@Version
private Integer version;
}
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
User user = userMapper.selectById(1L);
user.setName("张三");
// 自动:UPDATE user SET name=?, version=version+1 WHERE id=? AND version=?
userMapper.updateById(user);
✅ 并发场景:
WHERE version=1 不匹配 → 更新失败(影响行数 0)CREATE TABLE user (
id BIGINT PRIMARY KEY,
name VARCHAR(50),
version INT
);
int updateUser(User user);
<update id="updateUser">
UPDATE user
SET name = #{name},
version = version + 1
WHERE id = #{id}
AND version = #{version}
</update>
User user = userMapper.selectById(1L);
// 模拟并发修改
user.setName("新名字");
int rows = userMapper.updateUser(user);
if (rows == 0) {
throw new RuntimeException("更新失败,数据已被修改");
}
| 对比项 | 乐观锁 | 悲观锁 |
|---|---|---|
| 实现 | version / timestamp | SELECT ... FOR UPDATE |
| 性能 | ✅ 高 | ❌ 低 |
| 适用 | 读多写少 | 写冲突频繁 |
如果你愿意,我可以:
你现在是 MyBatis 还是 MyBatis‑Plus?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。