1、什么是乐观锁?

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


2、什么是悲观锁?

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


3、Mybatis中的乐观锁

乐观锁机制需要在表结构上额外加一个字段,一般名字叫version(版本的意思)。

(1)首先,在数据库表中添加int类型的字段,名字叫version,默认值为1。


(2)然后对应的更新实体类,加上字段,并使用@Version注解:

@Version
private Integer version;

(3)再新建一个配置类,在类中注册乐观锁插件:

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInnerInterceptor() {return new OptimisticLockerInterceptor();}
}

注意:别忘了加上@Configuration注解,告诉SpringBoot这是一个配置类。


(4)开始测试

更新成功的例子:

// 测试乐观锁 成功的例子
@Test
void testOptimisticLocker() {// 1、先查询出一条记录UserEntity userEntity = userMapper.selectById(16);// 2、修改该实体类信息userEntity.setAge(18);// 3、更新操作执行int count = userMapper.updateById(userEntity);System.out.println(count);  // 1
}

更新失败的例子,即多个线程修改同一条记录:

@Test
void testOptimisticLocker02() {// 线程1UserEntity userEntity1 = userMapper.selectById(16);userEntity1.setAge(10);// 模拟线程2,它在线程1修改之前,已经更新了16号的信息UserEntity userEntity2 = userMapper.selectById(16);userEntity2.setAge(20);int count2 = userMapper.updateById(userEntity2);System.out.println(count2);  // 1// 线程2修改完之后,线程1再去修改int count1 = userMapper.updateById(userEntity1);System.out.println(count1);  // 0
}

小结:

乐观锁只针对于更新操作。
当要更新一条记录的时候,希望这条记录没有被别人更新。

乐观锁实现原理:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

按照前篇说的那张表来说,更新时的打印的日志语句为:
UPDATE tbl_user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=?


注意:
Version支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

整数类型下newVersion = oldVersion + 1
newVersion会回写到entity实体类变量中。

仅支持 updateById(id)update(entity, wrapper) 方法。

在update(entity, wrapper)方法下,wrapper不能复用!!!


MybatisPlus中乐观锁的配置相关推荐

  1. 新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法

    新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法 在旧版的配置类我们一般直接注册就行了 // 注册乐观锁插件@Beanpublic ...

  2. MyBatisPlus的乐观锁和悲观锁

    MyBatisPlus的乐观锁和悲观锁 1.乐观锁 1.1 场景 2.0 乐观锁与悲观锁 3.0 模拟修改冲突 Demo 4.0 通过乐观锁观念解决问题 文章顺序及整体目录可查看(点我即可) 1.乐观 ...

  3. Mybatis-Plus的乐观锁和悲观锁

    乐观锁和悲观锁 如果没看懂.需要看下操作系统 模拟修改冲突 创建数据 CREATE TABLE t_product (id BIGINT(20) NOT NULL COMMENT '主键id',NAM ...

  4. Mybatis-Plus实现乐观锁配置

    乐观锁 主要解决 丢失更新问题 12306抢票问题 多人抢票 只有一人可以得到 第一步 数据库表中添加 version字段 第二步 在User实体类中添加属性并且加上@Version注解 @Versi ...

  5. MybatisPlus实现乐观锁

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

  6. mybatis-plus 使用乐观锁修改

    title 乐观锁与悲观锁 解决方案 code 测试 乐观锁与悲观锁 乐观锁:十分乐观,总是认为不会出现问题,无论干什么,都不会去上锁.如果出现了问题,就再次更新值测试. 悲观锁:十分悲观,认为总是出 ...

  7. mybatis-plus使用乐观锁插件

    参考博文 https://baijiahao.baidu.com/s?id=1659469738216922362&wfr=spider&for=pc 1 没有锁的风险 开发不设锁,就 ...

  8. java中乐观锁_Java中乐观锁与悲观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  9. 数据库中乐观锁与悲观锁的概念

    锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中 (可能是 ...

最新文章

  1. 基于arcgis的python脚本编程视频-面向ArcGIS的Python脚本编程 PDF 高清版
  2. MySQL自增字段并发插入导致死锁
  3. Daily scrum 10.15
  4. 吴恩达机器学习学习笔记第一章:绪论初识机器学习
  5. KNN回归python实现
  6. java编程需要数学知识吗_编程需要很好的数学吗?
  7. linux安装pdo mysql扩展_linux下php安装pdo_mysql扩展
  8. 接口的隐式和显式实现
  9. 微型linux系统裁剪
  10. vb.net学习笔记
  11. C语言最新学习路线(从入门到实战)
  12. 使用catagory类别给控件加边框
  13. JavaScript DOM 学习笔记
  14. 手环的PCBA部分,主要包括一颗集成BLE功能的MCU,以及由MCU控制的各种外设
  15. ABAP ALV DATA_CHANGED 函数使用说明 (ALV备忘二)
  16. 自动驾驶领域的Android?百度能否超越特斯拉和谷歌
  17. 关于一个web站点的欢迎页面
  18. 血管内冲击波:冠状动脉钙化处理的技术革新
  19. vue element 重新上传图片(将已经上传过的图片链接重新上传)
  20. 制作操作系统启动U盘

热门文章

  1. 华为matex搭载鸿蒙系统,华为 MateX 推迟至 9 月上市,或预装鸿蒙系统
  2. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法
  3. 春秋战国开局名臣搭配推荐
  4. POJ 1144 Network
  5. Re:从零开始的程序猿生活
  6. 2019值得购买的运动蓝牙耳机推荐
  7. Web前端HTML、CSS测试:世界地球日
  8. 89.破碎的玻璃横幅
  9. Unity-ProBuilder
  10. pump-probe技术简介