乐观锁插件

什么是乐观锁

乐观锁

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

  • 取出记录时,获取当前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 @ 2022-05-12 21:29  小罗要有出息  阅读(15)  评论(0编辑  收藏  举报