标签:用户 获得 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