安全证四川省建设厅官方网站,网络运营管理是做什么的,wordpress开发文档,关于asp_sql网站开发的书籍1、概念
在讲解乐观锁之前#xff0c;我们还是先来分析下问题:
业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售#xff0c;为了能保证每个商品或者票只能被一个人购买#xff0c;如何保证不会出现超买或者重复卖 对于这一类问题#xff0c;其实有很多的解决方…1、概念
在讲解乐观锁之前我们还是先来分析下问题:
业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售为了能保证每个商品或者票只能被一个人购买如何保证不会出现超买或者重复卖 对于这一类问题其实有很多的解决方案可以使用 第一个最先想到的就是锁锁在一台服务器中是可以解决的但是如果在多台服务器下锁就没有办法控制比如12306有两台服务器在进行卖票在两台服务器上都添加锁的话那也有可能会导致在同一时刻有两个线程在进行卖票还是会出现并发问题 我们接下来介绍的这种方式是针对于小型企业的解决方案因为数据库本身的性能就是个瓶颈如果对其并发量超过2000以上的就需要考虑其他的解决方案了。
简单来说乐观锁主要解决的问题是当要更新一条记录的时候希望这条记录没有被别人更新。
2、实现思路
乐观锁的实现方式: 数据库表中添加version列比如默认值给1 第一个线程要修改数据之前取出记录时获取当前数据库中的version1 第二个线程要修改数据之前取出记录时获取当前数据库中的version1 第一个线程执行更新时set version newVersion where version oldVersion newVersion version1 [2] oldVersion version [1] 第二个线程执行更新时set version newVersion where version oldVersion newVersion version1 [2] oldVersion version [1] 假如这两个线程都来更新数据第一个和第二个线程都可能先执行 假如第一个线程先执行更新会把version改为2 第二个线程再更新的时候set version 2 where version 1,此时数据库表的数据version已经为2所以第二个线程会修改失败 假如第二个线程先执行更新会把version改为2 第一个线程再更新的时候set version 2 where version 1,此时数据库表的数据version已经为2所以第一个线程会修改失败 不管谁先执行都会确保只能有一个线程更新数据这就是MybatisPlus提供的乐观锁的实现原理分析。 上面所说的步骤具体该如何实现呢?
3、实现步骤
分析完步骤后具体的实现步骤如下:
步骤1:数据库表添加列
列名可以任意比如使用version,给列设置默认值为1 步骤2:在模型类中添加对应的属性
根据添加的字段列名在模型类中添加对应的属性值
Data
//TableName(tbl_user) 可以不写是因为配置了全局配置
public class User {TableId(type IdType.ASSIGN_UUID)private String id;private String name;TableField(valuepwd,selectfalse)private String password;private Integer age;private String tel;TableField(existfalse)private Integer online;private Integer deleted;Versionprivate Integer version;
}
步骤3:添加乐观锁的拦截器
Configuration
public class MpConfig {Beanpublic MybatisPlusInterceptor mpInterceptor() {//1.定义MybatisPlus拦截器MybatisPlusInterceptor mpInterceptor new MybatisPlusInterceptor();//2.添加乐观锁拦截器mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mpInterceptor;}
}
步骤4:执行更新操作
添加version数据
SpringBootTest
class Mybatisplus03DqlApplicationTests {
Autowiredprivate UserDao userDao;Testvoid testUpdate(){User user new User();user.setId(3L);user.setName(Jock666);user.setVersion(1);userDao.updateById(user);}
} 你会发现我们传递的是1MybatisPlus会将1进行加1然后更新回到数据库表中。
所以要想实现乐观锁首先第一步应该是拿到表中的version然后拿version当条件在将version加1更新回到数据库表中所以我们在查询的时候需要对其进行查询
SpringBootTest
class Mybatisplus03DqlApplicationTests {
Autowiredprivate UserDao userDao;Testvoid testUpdate(){//1.先通过要修改的数据id将当前数据查询出来User user userDao.selectById(3L);//2.将要修改的属性逐一设置进去user.setName(Jock888);userDao.updateById(user);}
} 大概分析完乐观锁的实现步骤以后我们来模拟一种加锁的情况看看能不能实现多个人修改同一个数据的时候只能有一个人修改成功。
SpringBootTest
class Mybatisplus03DqlApplicationTests {
Autowiredprivate UserDao userDao;Testvoid testUpdate(){//1.先通过要修改的数据id将当前数据查询出来User user userDao.selectById(3L); //version3User user2 userDao.selectById(3L); //version3user2.setName(Jock aaa);userDao.updateById(user2); //version4user.setName(Jock bbb);userDao.updateById(user); //verion3?条件还成立吗}
}
运行程序分析结果 乐观锁就已经实现完成了如果对于上面的这些步骤记不住咋办呢?
参考官方文档来实现:乐观锁插件 | MyBatis-Plus