一、乐观锁
修改操作中的问题;乐观锁,琐是用来解决并发问题的。
例如秒杀业务, 上了100个秒杀单子, 如果到了最后一个, 8个人一起买,会出现问题,
卖出第0号 -1号 -2号,小型并发解决方案:乐观锁。
二、Mybatis-Plus乐观锁实现步骤
Mybatis-Plus乐观锁实现步骤:
步骤一:数据库表中添加锁标记字段
数据库加字段;user表 添加version字段, 默认值设置为1
步骤二:实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User { private Long id; @Version private Integer version; }
步骤三:配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
需求:执行修改操作SQL拼接添加条件,开拦截器,像分页拦截器一样;
update set abc=1,version = version + 1 where version =1
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor() { //1.定义Mp拦截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); //2.添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); //3.添加乐观锁拦截器 mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mpInterceptor; } }
步骤四:使用乐观锁机制在修改前必须先获取到对应数据的verion方可正常进行
//1.先通过要修改的数据id将当前数据查询出来 User user = userDao.selectById(3L); //2.将要修改的属性逐一设置进去 user.setName("Jock888"); userDao.updateById(user);
演示并发修改测试:
//1.先通过要修改的数据id将当前数据查询出来 User user = userDao.selectById(3L); //version=3 User user2 = userDao.selectById(3L); //version=3 //2.将要修改的属性逐一设置进去 user2.setName("Jock aaa"); userDao.updateById(user2); //version=>4 //2.将要修改的属性逐一设置进去 user.setName("Jock bbb"); userDao.updateById(user); //verion=3,条件不成立,修改失败
测试成功。