MybatisPlus乐观锁的实现

这篇博客介绍了如何利用乐观锁防止并发场景下数据丢失更新的问题。通过在数据库表中添加version字段,并在更新操作时检查version值,确保数据的一致性。详细步骤包括在实体类中定义version属性,添加@Version注解,配置乐观锁插件,以及展示测试用例中的SQL执行过程。

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

在并发情况下,多个线程同时对于同一条数据进行操作,可能会对出现数据丢失更新的问题,此类问题可以使用乐观锁来实现。
(1)在表中的字段与类中的属性字段要对应:
在这里插入图片描述

private int version;

(2)在属性加上相关注解

    @Version
    private int version;

(3)增加配置类

@Configuration
public class VersionConfig {
    /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

(4)测试添加数据

  @Test
    public void test02() {
        User user = new User();
        user.setAge(18);
        user.setEmail("1961871256@qq.com");
        user.setName("刘老师");
        int result = userMapper.insert(user);
        System.out.println(result);
    }
执行sql如下:
==>  Preparing: INSERT INTO user ( id, name, age, email, create_time, update_time, version ) VALUES ( ?, ?, ?, ?, ?, ?, ? ) 
==> Parameters: 1388048014324580354(Long), 刘老师(String), 18(Integer), 1961871256@qq.com(String), 2021-04-30 16:30:09.959(Timestamp), 2021-04-30 16:30:09.959(Timestamp), 0(Integer)
<==    Updates: 1

注意:如果version没有初始化值,第一次添加记录时version的默认值为0,每次修改一次version会增加1。

数据库的记录如下:
在这里插入图片描述修改该条记录,记录version的字段值变化

 @Test
    public void test03() {
        User user = userMapper.selectById(1388048014324580354l);
        user.setName("赵老师");
        int result = userMapper.updateById(user);
        System.out.println(result);
    }
执行SQL如下:
==>  Preparing: UPDATE user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=? 
==> Parameters: 赵老师(String), 18(Integer), 1961871256@qq.com(String), 2021-04-30 16:30:09.0(Timestamp), 2021-04-30 16:34:15.766(Timestamp), 1(Integer), 1388048014324580354(Long), 0(Integer)
<==    Updates: 1

数据库记录如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值