posts - 206,  comments - 26,  views - 17万
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

  一、乐观锁


修改操作中的问题;乐观锁,琐是用来解决并发问题的。

例如秒杀业务, 上了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,条件不成立,修改失败
复制代码

 


测试成功。

posted on   努力--坚持  阅读(44)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示