乐观锁插件
什么是乐观锁
乐观锁
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
如何实现乐观锁
- 在表中增加version字段
- 在实体类中添加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;
}
- 编写一个配置类
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();
}
}
- 测试
//单线程更新用户
@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的值
}
-
测试结果
- 单线程
- 多线程
- 单线程