先介绍一下乐观锁的版本号机制
一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
操作流程
1.现在mysql数据库以及pojo实体类添加version字段
@Version //乐观锁version注解
private Integer version;
2.写一个configuration配置类,注入乐观锁插件
package com.xc.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfigrution {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
3.测试乐观锁成功 单线程模式下
//测试乐观锁成功 单线程下
@Test
public void testOptimisticLocker(){
//查询用户信息
User user = userMapper.selectById(1);
//2修改用户信息
user.setEname("6222");
user.setEmail("233@qq.com");
int i = userMapper.updateById(user);
System.out.println(i);
}
4.测试乐观锁失败 多线程模式下
//测试乐观锁失败 多单线程下
@Test
public void testOptimisticLocker1(){
//线程1
User user = userMapper.selectById(1);
user.setEname("6222");
user.setEmail("233@qq.com");
//模拟另外一个线程执行了插队操作
//线程二
User user1 = userMapper.selectById(1);
user1.setEname("xc6222");
user1.setEmail("233@qq.com");
//线程二抢先更新
int i1 = userMapper.updateById(user1);
//线程二抢先更新后 线程一不进行更新操作
//如果没有配置乐观锁 线程二抢先更新的内容会被覆盖
int i = userMapper.updateById(user);
System.out.println(i1);
System.out.println(i);
}