乐观锁和悲观锁

如果没看懂。需要看下操作系统


模拟修改冲突
创建数据

CREATE TABLE t_product
(id BIGINT(20) NOT NULL COMMENT '主键id',NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',price INT(11) DEFAULT 0 COMMENT '价格',VERSION INT(11) DEFAULT 0 COMMENT '乐观锁版本号',PRIMARY KEY (id)
);

插入一条数据

INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人', 100);

在pojo包下创建Product类

package com.example.pojo;import lombok.Data;@Data
public class Product {private Long id;private String name;private Integer price;private Integer version;
}

在mapper包下创建Productmapper接口

package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.pojo.Product;
import org.springframework.stereotype.Repository;@Repository
public interface ProductMapper extends BaseMapper<Product> {}
@Testpublic void testProduct(){//小李查询价格Product productLi = productMapper.selectById(1);System.out.println("小李查询的商品价格:"+productLi.getPrice());//小王查询价格Product productWang = productMapper.selectById(1);System.out.println("小王查询的商品价格:"+productWang.getPrice());//小李将商品价格+50productLi.setPrice(productLi.getPrice()+50);productMapper.updateById(productLi);//小王将商品价格-30productWang.setPrice(productWang.getPrice()-30);productMapper.updateById(productWang);//老板查询商品价格Product productLaoan = productMapper.selectById(1);System.out.println("老板查询的商品价格:"+productLaoan.getPrice());}

最后查询结果

Mybatis-Plus的乐观锁插件

package com.example.pojo;import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;@Data
public class Product {private Long id;private String name;private Integer price;@Version//表示乐观符版本号字段private Integer version;
}
package com.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//添加分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//添加乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}

在运行,结果是老板查询价格是150
原因小李操作后,此时版本号是1,但小王操作时只是查询,并没有修改版本号,所以小王操作未成功

优化修改流程

@Testpublic void testProduct(){//小李查询价格Product productLi = productMapper.selectById(1);System.out.println("小李查询的商品价格:"+productLi.getPrice());//小王查询价格Product productWang = productMapper.selectById(1);System.out.println("小王查询的商品价格:"+productWang.getPrice());//小李将商品价格+50productLi.setPrice(productLi.getPrice()+50);productMapper.updateById(productLi);//小王将商品价格-30productWang.setPrice(productWang.getPrice()-30);int result = productMapper.updateById(productWang);if(result==0){//操作失败,重试Product productNew = productMapper.selectById(1);productNew.setPrice(productNew.getPrice()-30);productMapper.updateById(productNew);}//老板查询商品价格Product productLaoan = productMapper.selectById(1);System.out.println("老板查询的商品价格:"+productLaoan.getPrice());}

Mybatis-Plus的乐观锁和悲观锁相关推荐

  1. SpringBoot Mybatis 乐观锁和悲观锁

    这里写目录标题 1 悲观锁和乐观锁的原理 2 悲观锁和乐观锁的应用场景 3 悲观锁和乐观锁的总结 4 乐观锁 5 悲观锁 6 使用 Spring Retry 框架 6.1 添加依赖 6.2 启动类增加 ...

  2. MyBatisPlus的乐观锁和悲观锁

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

  3. [锁]:乐观锁、悲观锁与死锁

    文章目录 摘要 1 锁的相关概念 1.1 为什么需要锁? 1.2 本地锁 2 乐观锁与悲观 2.1 乐观锁 2.1.1 乐观锁的概念 2.1.2 乐观锁的解决思想 2.1.2.1 数据版本号机制思想 ...

  4. 乐观锁与悲观锁深入学习理解

    乐观锁与悲观锁深入学习理解 一.乐观锁和悲观锁 悲观锁 乐观锁 二.两种锁的使用场景 悲观锁 乐观锁 三.乐观锁实现方式 四.乐观锁的缺点 五.总结 参考文献 一.乐观锁和悲观锁 乐观锁和悲观锁并不是 ...

  5. [初级]深入理解乐观锁与悲观锁

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...

  6. 乐观锁与悲观锁——解决并发问题

    引言   在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失.例如: ...

  7. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  8. 乐观锁和悲观锁,可重入锁和不可重入锁(1)

    乐观锁和悲观锁,可重入锁和不可重入锁(1) 前言 感觉有一段时间没有写博客了呢.还是再接再厉吧,适当程度的总结能让我自己能够更加深入地巩固和理解自己所学习的一切. 还有,我很懒,而且我还是比较喜欢写日 ...

  9. Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...

最新文章

  1. MySql数据库explain用法示例_mysql explain的用法
  2. C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作
  3. mysql 12安装教程下载_MySQL 8.0.12.0安装教程
  4. LeetCode 20. 有效的括号 golang(三)
  5. 如何用java更改网页图片,java如何修改文档第一页为不同的页面
  6. centos 部署.netcore 开发环境
  7. python import py文件权限_python 常见问题:导入py文件易忽略问题
  8. 【Echarts】堆积柱状图
  9. linux复制dos命令,Linux mcopy复制MSDOS格式档案命令详解
  10. 7-2 古风排版 C语言
  11. matplotlib作图示例——阻尼衰减曲线、XRD数据绘图、三角函数绘图、超越函数绘图、正态分布随机数(插值多项式)
  12. c语言函数rewind作用,c语言中的rewind()是什么意思
  13. 关闭 Gatekeeper
  14. 【自动驾驶传感器融合系列】02自动驾驶中的多传感器同步理论
  15. 全返模式是怎样玩的?解析购盈利模式
  16. Markdown进阶
  17. 2017最新上海市居住证申领流程
  18. GAN掉人脸识别系统?GAN模型「女扮男装」
  19. Rust的安全系统编程
  20. MDClub简约轻量级论坛程序PHP源码

热门文章

  1. win10计算机搜索记录怎么删除,win10怎么清除文件资源管理器的搜索记录
  2. 115视听转存工具使用教程
  3. linux中LVM是什么类型,Linux_Linux中的LVM详解,什么是LVM?什么是LVM?LVM(Logi - phpStudy...
  4. 黑猫侦探网络声光报警器——小身形 大智慧 大作用
  5. QQ未解之谜——GIPS是何方神圣?
  6. Xcode 模拟器路径
  7. 爬虫 某团外卖mtgsig逆向分析
  8. 剑三插件教程:建立调试环境
  9. AMD ROCm 平台简介
  10. 水果店生意怎么运营好做,水果店现在生意好不好