mybatis-plus 使用乐观锁修改


乐观锁与悲观锁

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

悲观锁:十分悲观,认为总是出现问题,无论干什么,都去上锁。再去操作。

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

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
-- 多线程下 锁的处理
-- 乐观锁: 1. 先查询,获取版本号 version = 1
-- A 线程
update user set name = 'jack', version = version + 1
where id = 1 and version = 1

-- B 线程抢先完成,这个时候 更新version为 2,会导致A 修改失败
update user set name = 'jack', version = version + 1
where id = 1 and version = 1

解决方案

  1. 在表中加上version字段,int类型,默认值0

  2. 就目前最新版本的插件是3.4.1 ,需要将插件添加到拦截器中。不是注入bean。

	新版:OptimisticLockerInnerInterceptor 
	在3.4.1 中块过时的: OptimisticLockerInterceptor
  1. 在version字段上添加@Version 解决。

code

package cn.bitqian.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * mybatis plus配置类
 * @author echo lovely
 * @date 2020/11/15 09:48
 */

@EnableTransactionManagement // 开启事务
@MapperScan("cn.bitqian.mapper")
@Configuration
public class MyBatisPlusConfig {
    
    

    // mybatis插件注册
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    
    

        // 乐观锁
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

        // 添加乐观锁到插件中
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return mybatisPlusInterceptor;

    }


}


字段需要添加

测试

 @Test
 void testOptimisticLocker1() {
    
    
     User user = userMapper.selectById(1327447426226786310L);

     // 抢先修改
     User user1 = userMapper.selectById(1327447426226786310L);
     user1.setName("jjj");
     userMapper.updateById(user1);

     // 不会被修改,因为由于上面的修改version变了
     user.setName("bitqian666");
     userMapper.updateById(user);

 }

猜你喜欢

转载自blog.csdn.net/qq_44783283/article/details/109703836