数据库知识 乐观锁

概念

乐观锁实现方式

取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败

使用mybatis-plus测试乐观锁

1.给数据库添加一个version字段

2.实体类添加对应属性

@Version //声明该字段为乐观锁
    private Integer version;

3.根据官方文档 需要注册组件
使用官方文档提供的部分代码

package com.jie.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;
@MapperScan("com.jie.mapper")
@Configuration//配置类
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

4.进行测试

@Test//测试乐观锁 成功情况
    void test1(){
        User user = userMapper.selectById(1L);
        user.setName("被修改了的名字");
        userMapper.updateById(user);
    }

由于是单线程情况 所以version字段正常更新了

模拟多线程情况

@Test//测试乐观锁 多线程情况
    void test2(){
        //线程1
        User user = userMapper.selectById(1L);
        user.setName("线程1");
        //模拟另外一个线程插队
        User user2 = userMapper.selectById(1L);
        user2.setName("线程2");
        userMapper.updateById(user2);
        //如果没有乐观锁的保护 那么下面的更新操作就会执行并覆盖原数据
        userMapper.updateById(user);
    }

可以看到最终结果是只有线程二的更新操作,乐观锁保护了并发可能带来的问题

posted @ 2021-08-17 16:05  一个经常掉线的人  阅读(306)  评论(0)    收藏  举报