乐观锁
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
--A线程
update user set name = 'test',version = version + 1
where id = 1 and version = 1;
--B线程(此时如果B线程抢先完成修改操作,则A线程会执行失败)
update user set name = 'test',version = version + 1
where id = 1 and version = 1;
乐观锁插件测试
1.数据库增加version字段,并设置默认值为1
2.实体类
@Version
private int version;
3.注册组件
package com.sw.mybatisplus.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;
/**
* @Author suaxi
* @Date 2021/4/5 11:48
*/
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
4.单元测试
@Test
void update(){
User user = new User();
user.setId(11);
user.setName("自动填充测试");
user.setAge(30);
int result = userMapper.updateById(user);
System.out.println(result);
}
//测试乐观锁(成功)
@Test
void OptimisticLockerInterceptorTest1(){
//1.查询用户信息
User user = userMapper.selectById(10L);
//2.修改信息
user.setName("乐观锁测试01");
//3.执行更新
userMapper.updateById(user);
}
//测试乐观锁(失败)(模拟多线程)
@Test
void OptimisticLockerInterceptorTest2(){
User user = userMapper.selectById(10L);
user.setName("乐观锁测试111");
//模拟插队
User user1 = userMapper.selectById(10L);
user1.setName("乐观锁测试222");
userMapper.updateById(user1);
//自旋锁尝试多次提交
userMapper.updateById(user);
}
评论 (0)