乐观锁插件

创建时间:2025-11-13 22:54
长度:1685
浏览:0
评论:0

官网介绍:  https://baomidou.com/plugins/optimistic-locker/


乐观锁与悲观锁

在程序世界中,乐观锁和悲观锁的最终目的都是为了保证线程安全,避免在并发场景下的资源竞争问题。但是,相比于乐观锁,悲观锁对性能的影响更大!


字面意思理解:

乐观锁:总是假设最好的情况,认为别人都是友好的,所以每次获取数据的时候不会上锁,但更新数据那一刻会判断数据是否被更新过了,如果数据的值跟自己预期一样的话,那么就可以正常更新数据。

悲观锁:悲观锁就好像—个有迫害妄想症的患者,总是假设最坏的情况,每次拿数据的时候都以为别人会修改,所以每次拿数据的时候都会上锁,直到整个数据处理过程结束,其他的线程如果要拿数据就必须等当前的锁被释放后才能操作。



MyBatis-Plus给出的实现方式

   •取出记录时,获取当前 version

   •更新时,带上这个version

   • 执行更新时, set version = newVersion where version = oldVersion

   • 如果 version 不对,就更新失败



具体实现:

   1.  需要在数据库User表中添加版本version字段

   


   2. 在java User类中添加version成员、并且增加注解

public class User {
    ...
    @Version // 乐观锁注解
    private Integer version;

}


   3.  配置,在config 目录下新增MybatisPlusConfig.java文件


@Configuration
@MapperScan(basePackages = "org.huangcy.mybatisplusdemo.mapper")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}


   4. 模拟并发修改测试

    // 模拟多线程并发修改
    @Test
    void mybatisOptimisticLockerTest() {
        System.out.println("------线程1-----");
        // 查询用户信息(查出version)
        User user = userMapper.selectById(1L);
        // 修改用户信息
        user.setName("Huangcy");
        user.setAge(19);

        System.out.println("------线程2-----");
        User user2 = userMapper.selectById(1L);
        user2.setName("Huangcy22");
        user2.setAge(1922);

        // 执行更新
        userMapper.updateById(user2); // 线程2执行更新
        userMapper.updateById(user); // 线程1执行更新
    }

   在上面测试中,如果没有乐观锁的话,那么最后的name 应该是Huangcy age是19,现在加了乐观锁后,先执行线程2的,再执行线程1,发现version不一致,所以不会更新;





评论(共0条)