目录
乐观锁
问题引入
乐观锁实现思路
实现步骤
代码生成器
代码生成器分析
代码生成器实现
-
乐观锁
-
问题引入
- 业务并发现象带来的问题:秒杀
- 假如有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:运行程序
- 至此代码生成器就已经完成工作,我们能快速根据数据库表来创建对应的类,简化代码开发