5.Mybatis-plus_乐观锁和悲观锁

本文详细介绍了Mybatis-plus中如何实现乐观锁和悲观锁。首先解释了两者的概念,接着通过四个步骤展示了乐观锁的实现过程,包括在数据库中增加version字段,实体类中添加字段和注解,以及组件注册。经过测试,乐观锁成功防止了多线程并发修改数据的问题,证明其保护机制有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,
    再次更新值测试
  • 悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

乐观锁实现方式:

  • 取出记录时,获取当前 version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
乐观锁:
--A
1、先查询,获得版本号 version = 1 -- A update user set name = "wwj", version = version + 1 where id = 2 and version = 1 
-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败! update user set name = "wwj", version = version + 1 where id = 2 and version = 1

具体实现

1、给数据库中增加version字段!

在这里插入图片描述

2、我们实体类加对应的字段和注解
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.AUTO)
    private long id;
    private String name;
    private Integer age;
    private String email;
    
    @TableField(fill = FieldFill.INSERT)  //自动填充
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)  //自动填充
    private Date updateTime;
    
    @Version  //乐观锁
    private Integer version;
}
3、注册组件

增加config模块,然后编写MyBatisPlusConfig.java用于注册组件

@MapperScan("com.wwj.mapper")
@EnableTransactionManagement  //事务管理
@Configuration  //配置类
public class  {
    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();

    }


}

4.测试一下

//测试乐观锁
   @Test
   public void testOptimisticLocker(){
       User user = userMapper.selectById(1L); //
       // 2、修改用户信息
       user.setName("wwj333");
       user.setEmail("24736743@qq.com");
       // 3、执行更新操作
       userMapper.updateById(user);
   }

可见执行成功:数据更改且version更新
在这里插入图片描述
测试乐观锁的保护机制:模拟多线程修改数据

 @Test
    public void testOptimisticLocker2(){
        //线程1
        User user1 = userMapper.selectById(1L);
        user1.setName("wwj1");
        user1.setEmail("24736743111@qq.com");



        //线程2
        User user2 = userMapper.selectById(1L);
        user2.setName("wwj2");
        user2.setEmail("24736743222@qq.com");

        userMapper.updateById(user2);
        // 自旋锁来多次尝试提交!
        userMapper.updateById(user1); // 如果没有乐观锁就会覆盖插队线程的值!


    }

执行完成后,发现只执行了一次,后一次的修改并未成功;

在这里插入图片描述

在这里插入图片描述

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值