SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)

这篇具有很好参考价值的文章主要介绍了SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

乐观锁加注解@Version后不需要手动进行加1操作。乐观锁是一种用于解决并发冲突的机制,在数据库中用于保护数据的一致性。@Version注解是MyBatisPlus框架中的乐观锁注解,它会在更新数据时自动检查版本号是否一致,如果一致则进行更新操作,如果不一致则表示数据已被其他线程修改过,更新操作会失败。

@Version注解会自动对版本号进行加1操作,所以在使用乐观锁时不需要手动进行加1操作。当进行更新操作时,MyBatisPlus会自动更新版本号,并将更新后的版本号与更新条件一起发送给数据库,如果版本号在更新过程中发生变化,则说明数据已被其他线程修改,更新操作会失败。

因此,使用乐观锁加注解@Version后,可以简化代码,并且可以保证数据的一致性
使用场景: 当要更新一条数据时,希望这条数据没有被别人更新,也就是说实现线程安全的数据更新
1. 数据库新增version字段, int类型, 默认值为0

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo),乐观锁,数据库,java

2. 引入依赖
<!--MyBatisPlus 拦截器-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.5.1</version>
</dependency>
3. springboot启动类中新增bean

    /**
     * 支持拦截器乐观锁
     *
     * @return
     */
    @Bean
    public MybatisPlusInterceptor optimisticLockerInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
 
 
 
 
 
 
 
 
 
4. 实体类 version字段贴上注解 @Version

@Version
private Long version;
5. sql更新语句 (@Version注解会自动对版本号进行加1操作,所以在使用乐观锁时不需要手动进行加1操作)
// 没加@Version注解sql
update wx_dept set name=#{name}, sn=#{sn}, version=#{version}+1 where id=#{id} and version=#{version}



// 加了@Version注解sql
update wx_dept set name=#{name}, sn=#{sn}, version=#{version} where id=#{id} and version=#{version}
6. service (乐观锁操作步骤: 每次操作前都是先查询、替换、最后更新, 否则乐观锁无效)
    /**
     * 修改部门
     * 
     * @param wxDept 部门
     * @return 结果
     */
    @Override
    public AjaxResult updateWxDept(WxDept wxDept) {


        // 乐观锁操作步骤: 每次操作前都是先查询、替换、最后更新, 否则乐观锁无效

        // 1. 先查询
        WxDept dept = wxDeptMapper.selectWxDeptById(wxDept.getId());
        log.info("查询出来的数据: {}", dept);
        // 2. 替换
        dept.setName("小卖铺");
        dept.setSn("sell");
        // 3. 最后更新
        int i = wxDeptMapper.updateWxDept(dept);
        if (i > 0) {
            return AjaxResult.success("乐观锁更新成功");
        } else {
            return AjaxResult.error("乐观锁更新失败");
        }
    }
7. 测试
7.1 查询出id是1的数据, 并修改数据 name=小卖铺, sn=sell

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo),乐观锁,数据库,java

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo),乐观锁,数据库,java

查询出来的数据: com.ruoyi.ruoyiwx.dept.domain.WxDept@861f795[
  id=1
  name=开发部
  sn=dev
  version=0
]
7.2   假设7.1还没更新时, 就有其它线程修改了id为1的数据, 版本号version=1

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo),乐观锁,数据库,java

7.3   上面7.1执行update更新时就会失败, 因为版本号version=1, 不是刚查询出来的version=0 

SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo),乐观锁,数据库,java文章来源地址https://www.toymoban.com/news/detail-664537.html

{
    "msg": "乐观锁更新失败",
    "code": 500
}
总结: 
1. 每次去拿数据的时候都会认为别人不会修改数据, 所以不会上锁
2. 但是在更新的时候会判断在此期间有没有人去更新过这个数据, 可以使用版本号version

到了这里,关于SpringBoot + MyBatisPlus中乐观锁的实现 (精简demo)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包