数据库知识 乐观锁
概念

乐观锁实现方式
取出记录时,获取当前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);
}
可以看到最终结果是只有线程二的更新操作,乐观锁保护了并发可能带来的问题


浙公网安备 33010602011771号