MyBatisPlus学习乐观锁 OptimisticLockerInnerInterceptor插件 细解

Posted 毛_三月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatisPlus学习乐观锁 OptimisticLockerInnerInterceptor插件 细解相关的知识,希望对你有一定的参考价值。

乐观锁

OptimisticLockerInnerInterceptor

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

悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

我们这里主要讲解 乐观锁机制!

乐观锁实现方式:

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

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1 
-- A 
update user set name = "maomao", 
version = version + 1 
where id = 2 and version = 1 
-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
 update user set name = "maomao", 
 version = version + 1 where id = 2 and version = 1

测试一下MP的乐观锁插件

1、给数据库中增加version字段!

2、我们实体类加对应的字段

@Version //乐观锁Version注解 
private Integer version; 

3、注册组件

// 扫描我们的 mapper 文件夹
@MapperScan("com.mao.mapper")
@EnableTransactionManagement    //自动管理事务的注解
@Configuration // 配置类
public class MyBatisPlusConfig {

    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

4、测试一下

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

// 测试乐观锁失败!多线程下
    @Test
    public void testOptimisticLocker2(){

        // 线程 1
        User user = userMapper.selectById(1L);
        user.setName("maomao111");
        user.setEmail("24736743@qq.com");

        // 模拟另外一个线程执行了插队操作
        User user2 = userMapper.selectById(1L);
        user2.setName("maomao222");
        user2.setEmail("24736743@qq.com");
        userMapper.updateById(user2);

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

更多相关文章点这里

【Java全栈】Java全栈学习路线及项目全资料总结【JavaSE+Web基础+大前端进阶+SSM+微服务+Linux+JavaEE】

以上是关于MyBatisPlus学习乐观锁 OptimisticLockerInnerInterceptor插件 细解的主要内容,如果未能解决你的问题,请参考以下文章

第120天学习打卡(MyBatisPlus 概述 特性 入门 配置日志 CRUD扩展 乐观锁)

mybatisplus乐观锁

MyBatisPlus如何实现乐观锁

[MyBatisPlus]乐观锁和悲观锁

[MyBatisPlus]乐观锁和悲观锁

MyBatis Plus乐观锁常用配置