MybatisPlus中的乐观锁操作

目录

乐观锁与悲观锁

乐观锁的实现方式

测试乐观锁插件


 

乐观锁与悲观锁

 

乐观锁:它总是认为不会出现问题,无论干什么都不去上锁!如果出现问题再次更新值测试

悲观锁:它总是认为肯定会出现问题,无论干什么都会上锁,再去操作!

 

 

乐观锁的实现方式

 

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

MybatisPlus中的乐观锁操作_第1张图片

 

 

测试乐观锁插件

 

我们在表中新建一个version字段,并让默认值设置为1

MybatisPlus中的乐观锁操作_第2张图片

保存后效果如下

MybatisPlus中的乐观锁操作_第3张图片

实体类字段属性上需要增加注解

    @Version //乐观锁
    private Integer version;

编写配置类来注册乐观锁插件

//扫描我的mapper文件夹
@MapperScan("com.lt.mapper")
@EnableTransactionManagement
//配置类
@Configuration
public class MybatisPlusConfig {
    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

测试乐观锁执行成功

    //测试乐观锁成功
    @Test
    public void testOptimisticLocker(){
        //1查询用户信息
        User user = userMapper.selectById(1L);
        //2修改用户信息
        user.setName("lt");
        user.setEmail("[email protected]");
        //3执行更新操作
        userMapper.updateById(user);
    }

 单线程下乐观锁执行成功,version+1

MybatisPlus中的乐观锁操作_第4张图片

测试乐观锁执行失败

    //多线程下测试乐观锁失败
    @Test
    public void testOptimisticLocker2(){
        //线程1
        User user = userMapper.selectById(1L);
        user.setName("我又来啦");
        user.setEmail("[email protected]");

        //模拟另一个线程执行了插队操作
        User user2 = userMapper.selectById(1L);
        user2.setName("第二个线程来啦");
        user2.setEmail("[email protected]");
        userMapper.updateById(user2);

        //自旋锁来多次尝试提交,如果我们没有使用乐观锁就会覆盖插队线程的值
        userMapper.updateById(user);
    }

version又加一,保留的是插队线程传进去的值

 MybatisPlus中的乐观锁操作_第5张图片

你可能感兴趣的:([MyBatis-Plus])