title

  • 乐观锁与悲观锁
  • 解决方案
  • code
  • 测试

乐观锁与悲观锁

乐观锁:十分乐观,总是认为不会出现问题,无论干什么,都不会去上锁。如果出现了问题,就再次更新值测试。

悲观锁:十分悲观,认为总是出现问题,无论干什么,都去上锁。再去操作。

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

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

解决方案

  1. 在表中加上version字段,int类型,默认值0

  2. 就目前最新版本的插件是3.4.1 ,需要将插件添加到拦截器中。不是注入bean。

 新版:OptimisticLockerInnerInterceptor 在3.4.1 中块过时的: OptimisticLockerInterceptor
  1. 在version字段上添加@Version 解决。

code

package cn.bitqian.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** mybatis plus配置类* @author echo lovely* @date 2020/11/15 09:48*/@EnableTransactionManagement // 开启事务
@MapperScan("cn.bitqian.mapper")
@Configuration
public class MyBatisPlusConfig {// mybatis插件注册@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 乐观锁MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();// 添加乐观锁到插件中mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}}

字段需要添加

测试

 @Testvoid testOptimisticLocker1() {User user = userMapper.selectById(1327447426226786310L);// 抢先修改User user1 = userMapper.selectById(1327447426226786310L);user1.setName("jjj");userMapper.updateById(user1);// 不会被修改,因为由于上面的修改version变了user.setName("bitqian666");userMapper.updateById(user);}

mybatis-plus 使用乐观锁修改相关推荐

  1. 配置MyBatis Plus 的乐观锁功能

    配置MyBatis Plus 的乐观锁功能 一. 回顾CAS乐观锁 CAS: 二. 配置MyBatis Plus 的乐观锁 (1)数据库:添加version版本号 (2)实体类:添加version版本 ...

  2. MybatisPlus实现乐观锁

    乐观锁 主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新 乐观锁实现方式: 取出记录时,获取当前version 更新时,带上这个version 执行更新 ...

  3. MybatisPlus中乐观锁的配置

    1.什么是乐观锁? 乐观锁:十分乐观,它总是认为不会出现问题,无论干什么,都不去上锁!如果出现了问题,就重新更新值. 2.什么是悲观锁? 悲观锁:十分悲观,它总是认为会出现问题,无论干什么,都加上锁, ...

  4. [MyBatisPlus]乐观锁和悲观锁

    乐观锁和悲观锁 场景 一件商品,成本价是80元,售价是100元.老板先是通知小李,说你去把商品价格增加50元.小李正在玩游戏,耽搁了一个小时.正好一个小时后,老板觉得商品价格增加到150元,价格太高, ...

  5. mybatis mysql 乐观锁_基于tx.mapper实现的mysql乐观锁

    1.表CREATE TABLE `demo` ( `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '物理主键', `demo_id` varchar(3 ...

  6. mybatis 乐观锁_MybatisPlus新特性之逻辑删除、乐观锁、自动填充

    MP特性 公共字段的自动填充功能 自动更新全局属性,比如创建的时间修改的时间,这样就不用每执行一次插入更新操作都带上一个set大大节省了很多效率,从而也避免为了因为时间格式的不统一问题. 为了输出日志 ...

  7. mybatis 乐观锁和逻辑删除

    本篇介绍easymybatis如配置乐观锁和逻辑删除. 乐观锁 easymybatis提供的乐观锁使用方式跟JPA一样,使用@Version注解来实现.即:数据库增加一个int或long类型字段ver ...

  8. 共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改、读脏数据...

    作者:T-Birds blog.csdn.net/weixin_36634753/article/details/90815755 共享锁(S锁): 又称为读锁,可以查看但无法修改和删除的一种数据锁. ...

  9. Elasticsearch 并发修改乐观锁

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 并发修改乐观锁 博客分类: 搜索引擎,爬虫 来自: http://blog.csdn.net//j ...

最新文章

  1. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
  2. 近期北京动点软件发现XXX公司盗用我公司WPF项目案例
  3. 从近年CVPR看域自适应立体匹配
  4. Boost:parallel grep测试程序
  5. Oracle10g在linux下安装详解
  6. 轻松监控Docker容器中的ADF应用程序
  7. Spring 下注解说明
  8. Ubuntu16.04安装matlab 2015b教程(含下载和激活文件)
  9. 全国省、市、县(区)编码表
  10. 我国支付结算体系概况
  11. java 压缩文件夹有几率压缩失败,打开显示不可预料的末端且用其他专业软件解压文件没压缩完全
  12. walking与Matlab入门教程-连接到walking机器人
  13. cad工具箱详细讲解_CAD的工具说明及使用讲解
  14. 斯坦福大学开源四足机器人pupper腿部组装(上)
  15. python应用——分治法实现循环赛
  16. 每日一言:站在高山之巅的人
  17. iqoo手机可以刷鸿蒙系统吗,华为老机型可以更新鸿蒙系统么-华为哪些老机型支持鸿蒙系统...
  18. 软考高级软件架构师学习笔记一(软件架构设计)
  19. bert如何应用于下游任务_培训特定于法律域的BERT
  20. CSC7715 同步整流

热门文章

  1. 前端学习(1704):前端系列javascript之问题解答2和总结
  2. mybatis学习(3):映射文件的配置和接口创建
  3. 数字图像处理技术的应 用领域
  4. html:(26):类选择器和id选择器
  5. 高压断路器故障诊断的相关方法
  6. 深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类
  7. 连续赋值与求值顺序var a = {n:1};a.x = a = {n:2}; alert(a.x);
  8. Hessian之简单使用
  9. GO语言-基础语法:条件判断
  10. [JSOI 2015] 子集选取