5.MyBatis Plus乐观锁插件
乐观锁意图
- 当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁的实现方式
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
第一步:在数据库中添加version字段
- 设置默认值为1
第二步:实体类添加相应的字段
- @Version注解:表明这是一个乐观锁Version注解
@Version
private Integer version;
第三步:需要注册组件(根据官网来)
- 就是乐观锁插件需要注入OptimisticLockerInterceptor类到IOC容器中
- @Configuration:表明这是一个配置类只有加了这个配置的bean才能生效
- 这里加了事务支持
package com.xuan.interceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
/**
* xuan
* 2020/7/21
* 1870136088@qq.com
**/
@EnableTransactionManagement
@Configuration
public class MyInterceptor {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
第四步:进行测试
- 先测试只有一个用户需要更新 乐观锁成功案例
//测试一个任务 乐观锁成功案例
@Test
void testOptimistic() {
//第一步:查询id为1的用户
User user = userMapper.selectById(1l);
//第二步:对改用户进行设置
user.setAge(52);
user.setName("kaikai");
user.setEmail("zzkshierzi@163.com");
//第三步:更新该用户信息
int i = userMapper.updateById(user);
System.out.println(i);
}
- 测试结果
测试乐观锁失败案例
- 代码实现
- 可以使用自旋锁来多次尝试提交
//测试多个任务 乐观锁失败案例
@Test
void testOptimistic2() {
//第一步:查询id为1的用户
User user = userMapper.selectById(1l);
//第二步:对改用户进行设置
user.setAge(52);
user.setName("kaikai");
user.setEmail("zzkshierzi@163.com");
//第三步:模拟多任务环境,另一个任务也对该用户进行操作
//第四步:查询id为1的用户
User user2 = userMapper.selectById(1l);
//第五步:对改用户进行设置
user2.setAge(52);
user2.setName("Optimistic");
user2.setEmail("zzkshierzi@163.com");
//第六步:更新该用户信息
userMapper.updateById(user2);
//第七步:更新该用户信息
//可以使用自旋锁来多次尝试提交
userMapper.updateById(user);
}
- 结果展示