Mybatis-Plus 乐观锁与代码生成器

news2024/9/22 21:20:21

目录

乐观锁

问题引入

乐观锁实现思路

实现步骤

代码生成器

代码生成器分析

代码生成器实现


  • 乐观锁

  • 问题引入

  • 业务并发现象带来的问题:秒杀
    • 假如有100个商品或者票在出售,为了能保证每个商品或者票只能被一个人购买,如何保证不会出现超买或者重复卖
    • 对于这一类问题,其实有很多的解决方案可以使用
    • 第一个最先想到的就是锁,锁在一台服务器中是可以解决的,但是如果在多台服务器下锁就没有办法控制,比如12306有两台服务器在进行卖票,在两台服务器上都添加锁的话,那也有可能会导致在同一时刻有两个线程在进行卖票,还是会出现并发问题
    • 我们接下来介绍的这种方式是针对于小型企业的解决方案,因为数据库本身的性能就是个瓶颈,如果对其并发量超过2000以上的就需要考虑其他的解决方案了
  • 乐观锁主要解决的问题是当要更新一条记录的时候,希望这条记录没有被别人更新
  • 乐观锁实现思路

    • 数据库表中添加version列,比如默认值给1
    • 第一个线程要修改数据之前,取出记录时,获取当前数据库中的version=1
    • 第二个线程要修改数据之前,取出记录时,获取当前数据库中的version=1
    • 第一个线程执行更新时,set version = newVersion where version = oldVersion
      • newVersion = version+1 (2)
      • oldVersion = version (1)
    • 第二个线程执行更新时,set version = newVersion where version = oldVersion
      • newVersion = version+1 (2)
      • oldVersion = version (1)
    • 假如这两个线程都来更新数据,第一个和第二个线程都可能先执行
      • 假如第一个线程先执行更新,会把version改为2,
      • 第二个线程再更新的时候,set version = 2 where version = 1,此时数据库表的数据version已经为2,所以第二个线程会修改失败
      • 假如第二个线程先执行更新,会把version改为2,
      • 第一个线程再更新的时候,set version = 2 where version = 1,此时数据库表的数据version已经为2,所以第一个线程会修改失败
    • 不管谁先执行都会确保只能有一个线程更新数据,这就是MP提供的乐观锁的实现原理分析
  • 实现步骤

  • 步骤1:数据库表中添加锁标记字段

  • 步骤2:实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

  • 步骤3:配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装

  • 步骤4:使用乐观锁机制在修改前必须先获取到对应数据的verion方可正常进行
  • 执行修改时使用version字段作为乐观锁检查依据
  • 代码生成器

  • 代码生成器分析

  • 观察我们之前写的代码,会发现其中也会有很多重复内容,比如:

  • 如果想做一个Book模块的开发,是不是只需要将红色部分的内容全部更换成Book即可,如:

  • 做任何模块的开发,对于这段代码,基本上都是对红色部分的调整
  • 所以把去掉红色内容的东西称之为模板,红色部分称之为参数
  • 以后只需要传入不同的参数,就可以根据模板创建出不同模块的dao代码
  • 除了Dao可以抽取模块,其实常见的类都可以进行抽取,只要他们有公共部分即可
  • 再来看下模型类的模板:

  • 分析完成后,要想完成代码自动生成,需要有以下内容:
    • 模板:MyBatisPlus提供,可以自己提供,但是麻烦,不建议
    • 数据库相关配置:读取数据库获取表和字段信息
    • 开发者自定义配置:手工配置,比如ID生成策略
  • 代码生成器实现

  • 步骤1:导入对应依赖

  • 步骤2:创建代码生成类,设置相关配置
  • 步骤3:运行程序
  • 至此代码生成器就已经完成工作,我们能快速根据数据库表来创建对应的类,简化代码开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次nginx崩溃事件

一、事件描述 2023年春节复工第一天,项目组同事反馈说业务系统中图像处理代理Nginx服务于1月23日发生崩溃,完成了重启操作,检查nginx的日志有如下报错: 2023/01/23 11:07:07 [crit] 3237#3237: *2253009 pwritev() "/var/c…

网络编程-----(Socket编程TCP)

在咱们的TCP API中,也是主要是涉及到两个类: 1)ServerSocket:主要是给TCP服务器来进行使用的; 2)Socket:我们既需要给客户端来进行使用,也需要给服务器来进行使用; 这样就是说我们是不需要使用专门的类来进行表示传输的包&#x…

Java学习之抽象模板模式

目录 一、基本介绍 二、模板设计模式能解决的问题 三、最佳实践 一、AA类 二、BB类 三、main方法实现 四、提取相同语句 五、建立继承关系 父类-Template 子类-AA类 子类-BB类 六、运行中的动态绑定机制 一、基本介绍 抽象类体现的就是一种模板模式的设计&#xff…

【Git】概述

目录 1.1 是什么 介绍 历史时间轴 版本控制工具 1.2 能干嘛 作用 Git工作机制 代码托管中心 集中式版本控制系统 分布式版本控制系统 1.3 去哪下 命令行工具:Git for windows 操作系统中可视化工具:TortoiseGit(了解) GitHub网站 1.1 是什…

带你走进Java8新特性Stream流的小世界

目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 s…

智公网:2023年教师编必背30考点

1、制度化教育阶段开始于:近代。 2、各国的学校教育系统基本形成于:19世纪末。 3、现在世界上大多数国家的义务教育年限在:9年或9年以上。 4、“不愤不启,不悱不发”启发教学法的最早倡导者是:孔子。 5、“建国君民…

【Spring】Spring 6 新特性一一HTTP Interface

简介 Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。 这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求…

硬盘损坏数据恢复怎么操作?恢复数据的常用方法

硬盘一般固定在电脑里面的存储装置,里面保存着我们大量的数据。随着电脑的使用越加广泛,有时不免出现一些问题,比如硬盘在使用过程中出现数据错误,或者是硬盘的内部零件出现故障。出现这些问题,硬盘损坏数据恢复怎么操…

Redis实现UV统计 | 黑马点评

一、HyperLogLog 1、为什么用HyperLogLog 先介绍两个概念: UV:全称 Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人、1 天内同一个用户多次访问该网站,只记录 1 次。PV:全称 …

车载以太网 - SomeIP测试专栏 - 总纲

关于车载以太网中的SomeIP在网上也逐渐有越来越多的资料,讲的也是非常好;但是个人认为讲的泛,很难让初学者或者初入门者真正了解SomeIP到底是一个什么东西,以及它究竟在车载上有什么作用,本专栏会由浅入深的讲解SomeIP整个协议内容规范,并且对Tc8中SomeIP相关的协议测试用…

实习日记!

目录 http://localhost:5789实习第三天 接下来几天的target 实习第四天 Git的操作 实习第五天 12月5日-Mon 12月6日 12月9日 12月12日 12月15日 useState() hook 12月16日 useEffect() hook async 函数 异步编程 回调函数 12月17日 C#中的?&#x…

postgresql源码学习(54)—— HotStandby从库必须设置大于等于主库的参数

新的一篇本来计划研究lazy_scan_heap函数,但过于复杂还没研究出来… 下午做题遇到一个这样的问题,之前没太关注过,打算学习学习,避免主从配置踩坑。 题干搜一搜,没搜出啥有用的玩意…渣翻成英文搜一搜,搜出…

windows搭建go语言开发环境,IDEA安装go插件并运行Hello world代码

2023年1月27日1.Windows上安装Go语言开发包参考链接:http://c.biancheng.net/view/3992.html1.1.下载Go语言开发包可以在Go语言官网 (https://golang.google.cn/dl/) 下载Windows 系统下的Go语言开发包,如下图所示。这里我们下载的…

学习Docker就应该掌握的dockerfile语法与指令

在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。Docker commitDocker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。docker commit 容…

Git场景分析

当前的开发环境如下,我们每个人都对这个项目已经开发一段时间,接下来我们要切换成团队开发模式。 也就是我们由一个团队来完成这个项目实战的内容。团队有组长和若干组员组成(组长就是开发中的项目经理)。 练习场景如下: 1.由组长&#xff0…

LeetCode[1202]交换字符串中的元素

难度:中等题目:给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] [a, b]表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs中任意一对索引处的字符。返回在…

java递归问题——汉诺塔

目录 🌲🌲什么是汉诺塔? 🐰 当只有1个圆盘的时候: 🐰 当只有2个圆盘的时候: 🐰 当只有3个圆盘的时候: 🌲🌲汉诺塔代码 🐰思路 &am…

电脑安全模式怎么进?3种方式教会你!

安全模式经常是电脑死机的时候,我们会选择的一种方式。因为安全模式可以帮助我们修复电脑系统里面的一些错误,电脑安全模式怎么进?其实很简单,主要有以下3种方式,你可以根据你的需要来选择其中一种! 操作环…

剑指 Offer 第7天(中午睡起来都十二点了,今天摆了吧)

目录 剑指 Offer 26. 树的子结构 剑指 Offer 27. 二叉树的镜像 剑指 Offer 28. 对称的二叉树 剑指 Offer 26. 树的子结构 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点…

极光厂商通道集成指南

小米集成指南 1、使用JCenter自动化集成步骤 确认AndroidStudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持) buildscript { repositories { jcenter() } } allprojects {repositories { jcenter() } } 在应用module的gr…