乐观锁插件

什么是乐观锁

乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

如何实现乐观锁

  1. 在表中增加version字段
    image
  2. 在实体类中添加version字段,并加上@Version注释
package top.luoking.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class user {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
@Version //指明这是一个乐观锁字段
private Integer version;
@TableField(fill = FieldFill.INSERT)//填充字段,在插入时填充
private Date createTime; //尝试驼峰命名是否可以? 可以的
@TableField(fill = FieldFill.INSERT_UPDATE)//填充字段,在插入和更新时填充
private Date updateTime;
}
  1. 编写一个配置类
package top.luoking.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //表明这是一个配置类
@MapperScan("top.luoking.mapper") //指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
public class MyBatisConfig {
@Bean //旧版 (3.0.5版本)
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
  1. 测试
//单线程更新用户
@Test
void TestOptimisticLocker(){
user user = userMapper.selectById(1L);
user.setName("西奥");
user.setEmail("2034281742@qq.com");
userMapper.updateById(user);
}
@Test
void TestOptimisticLocker2(){
//启动两条线程,更新用户
user user = userMapper.selectById(1L);
user.setName("西奥");
user.setEmail("2034281742@qq.com");
user user1 = userMapper.selectById(1L);
user1.setName("西奥");
user1.setEmail("2034281742@qq.com");
userMapper.updateById(user1); //线程2插队更新用户
userMapper.updateById(user);//如果没有乐观锁,哪线程1就会覆盖线程2的值
}
  1. 测试结果

    1. 单线程
      image
    2. 多线程
      image
posted @   小罗要有出息  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示