标签:用户 获得 clock height use 就会 修改 线程二 没有
乐观锁
在面试过程中会经常问到乐观锁、悲观锁!常用字段:varsion、new varsion
乐观锁:顾名思义非常乐观,认为总是不会出现问题,无论干什么都不上锁,如果出现问题,更新值在测试!
悲观锁:顾名思义非常悲观,认为总是会出现问题,无论干什么都上锁,再去操作!
乐观锁实现方式:
乐观锁: -- A 先查询,获得版本号version = 1 update user set name = " kuangshen", version = version + 1 where id = 2 and version= 1 -- B 线程抢先完成,这个时候version = 2,会导致A修改失败! update user set name = "kuangshen", version = version + 1 where id= 2 and version = 1
测试乐观锁插件
1.给数据库新增 version

2.实体类添加varsion字段
@Version //乐观锁 version 注解 private Integer version;
3.注册组件
//扫描我们的 mapper文件夹
@MapperScan("com.ljj.mapper")
@EnableTransactionManagement
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
mybatis-plus官网乐观锁插件方法:https://baomidou.com/guide/optimistic-locker-plugin.html#_1-%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE
//乐观锁测试 (成功测试)
@Test
public void OptimisticLocker(){
//1.查询用户信息
SysUser sysUser = userMapper.selectById(1L);
//2.修改用户信息
sysUser.setUsername("手残");
sysUser.setPassword("111111");
//3.执行更新操作
userMapper.updateById(sysUser);
}
//乐观锁测试 (失败测试)
@Test
public void OptimisticLocker2(){
//线程一
SysUser sysUser = userMapper.selectById(1L);
sysUser.setUsername("手残1");
sysUser.setPassword("111111");
//模拟另一个线程二 执行了插队操作
SysUser sysUser2 = userMapper.selectById(1L);
sysUser2.setUsername("手残2");
sysUser2.setPassword("222222");
userMapper.updateById(sysUser2);
//自旋锁来执行多次提交
userMapper.updateById(sysUser);//没有乐观锁就会覆盖插队操作的值
}
执行后数据库更新的数据
![]()
标签:用户 获得 clock height use 就会 修改 线程二 没有
原文地址:https://www.cnblogs.com/jjsir/p/13632794.html