00:01
各位同学大家好,欢迎继续收看上硅谷视频课程。我们继续学习上一通项目。我们今天内容呢,主要给大家讲MP实现对数据库的增删改操作,刚才呢,咱们演示了MP实现对数据库的简单的海运操作,包括添加操作,包括修改操作,以及MP中一个特性。叫做自动填充,那我们下面来演示MP中的另外一个特性,就是乐观锁的实现,那乐观锁中的给各位主要来讲解这么几个内容。首先第一个给大家先说一下什么是乐观锁。包括乐观锁该怎么实现,以及我们在MT中该怎么做到乐观锁的效果,那我下面给各位说一下,就是什么是乐观锁,那我们看一下乐观锁呢,它主要的是用场景是怎么样的呢?我这里写到当你要更新一条记录的时候呢,而希望这条记录没有被别人更新,也就是说实现线程安全的数据更新,那我强调乐观所其实它本身呢,是针对一类问题的一种解决方案,它主要针对就是多线程操作中,或者说你的并发操作中产生的一类问题,这个叫乐观锁,那它主要是用来解决什么问题的呢?那我下面给各位来画张图,咱做个分析。
01:31
那我写一下。乐观所是用于解决某类问题的这么一种方案,那他解决什么问题,给大家画一下,比如说我现在啊,这里边有这么一条地路,而记录里边呢,比如说我现在有这么两个字段值,第一个就是它的ID,比如这个ID。假如ID是100,然后第二个呢,比如说是他这个就是人的这个名字,假如他的名字我们叫Lucy。
02:04
然后第三个,比如说是这个人的这个工资,假如这个人他这个工资就是他每月能挣。5000块钱。所以这是我们有条记录,而我现在一个场景,比如现在啊,我有两个人都想对这条记录进行操作,那这个过程中就会产生一类问题,我强调只是你多人操作同一条记录,比如说你到并发中才会有的问题,如果你只有一个人操作,那这问题不存在,比如说现在我有两人,假如第一个人是这个。赵三,比如第二个人是这个。李四,而张三李四就是他们两个人都想去改这条记录,那这过程中就会产生问题,那产生什么问题给各位说一下,比如现在张三也好,李四也好,要改造数据,在咱数据库操作中,他们首先是不是都需要先开启事物。假如张三,比如开启事物一。
03:03
然后李四,比如说开启事务二,两人是不是都需要开启事务,比如现在张三开启事务之后,他对这条记录做了修改,他就把这个人的工资,比如他是从5000。改成了这个。9000他做这个事情,而比如现在李次也做了事情,他把这个Lu的工资从5000,比如他改成了100,都做了修改,当然各位注意,两人都去改同一套记录,他们都开启了事物,最终事物是不是要提交我,比如我现在张三,他首先。提交了事物一,而他提交之后问各位同学,你说目前会有什么效果?张三提交有什么效果?我数据库中的这个工资就不是5000了吧,而变成多少是变成了9000,他目前就是9000了。而提交之后就是张三挺高兴,他就走了,这时候李四呢?他是不是也要提交事务,但是李四一提交事务就出现了问题,他提交事物之后问各位,你说现在表里面数据是有多少?
04:14
是不是就变成了100啊,那你说是问题,比如说这里边张三某天他要回来看工资,他发现工资是不对了,明明我改成了9000,怎么又变成100,所以这个问题就是我们发生一个问题,而这问题在我们术语中有一个描述,它叫什么叫做丢失更新问题,就是你多人都去改成一套记录,而最后调的事物会把之前的事物是不是给它覆盖掉的,这种效果肯定是不对的,而正常咱应该怎么操作?大家可以想一下正确你说怎么操作。怎么操作?张三是不是先把数据改成了9000,然后李四拿到9000之后,他把9000是不是改成100,而不是两人都去改同一条5000条记录,所以这肯定是不对的,这个问题又叫丢失更新问题,而这个问题怎么解决,咱就可以用乐观所方式把它解决掉,所以这是我们乐观所它能做什么事情,主要用于解决这类问题的。
05:19
那乐观所怎么解决?给各位说一下它的解决方案,其实很简单,就是加上这个东西,Wash。是什么版本号?就是每次我们改出去之后把版本号更新,每次改出去之前跟版本号做比较,如果相同的话就更新,不相同就不更新。那我下面给大家画一下这个乐观锁是怎么实现的,它主要是加一个版本号。比如我现在。在里边我加个字段,这字段我起个名字,比如都叫version。版本号,比如他现在初始版本是一,而现在张三李四是不是都得到这个数据,而他们得到数据目前的版本号version是不是都能一啊,就是张三这个version是一,李四是还是一啊,而最终要提交,而提交的时候呢,这里边会做件事情,做什么事情呢?给各位写一下,就是比较一下。
06:16
我们。当前你要修改的这个数据的版本和数据库里边的版本是否一样,如果一样的话进行提交,不一样就不提交,但是各位看,比如现在我张三做过比较,他发现我当前版本我一数据库中是不是还是一,他一提交一比较版本是不是一样,其以他就可以提交,而提交之后他还要做点事情,做什么事情把这个。提交之后,数据的版本号给他做一个更新,之前是一,他把这版本号从这个一就变成了什么,变成了二,班本号就加一了,而加一之后它最终这里变成9000,而班本号应该不是一了,是不是要变成二了,因为他班本号加了一,而他提交之后就完成了李四十秒提交,但是李四提时候发生了问题。
07:18
李四,得到版本号是不是还是一,他一比较发现当前数据版本跟数据库中的版本是不一样吗?一不一样怎么样?是不是就不能提交了?因为班符号不一样,表示数据已经发生变化,你改的就不是最新数据,所以说里次就不能提交,所以这个过程就是咱说的乐观所得解决方案,它通过加个版本号来解决丢失更新问题,这各位要知道。而乐观所在,实际中有很多的场景,给大家举一个很典型例子,就咱说那个。抢票这个例子这各位应该都感受过啊,这个大家注意,现在在系统中,比如只有一张票,那一张票是不是可以有很多人去抢这一张票,比如现在1万个人都去抢一张票是不是可以,但最终是不是只有一个人最终支付成功买到票了,这个过程就是用乐观所这种方案解决的,加个版本号谁填提交之后别人就不能操作,因为版本号已经发生了变化,所以他在提交之前要把版本号做这么一个比较。
08:26
这个就是乐观所的这么一种解决方案,所以各位把这个得知道,所以现在呢,我就把什么是乐观所,包括乐观所的解决方案给各位做了一个说明,而这过程各位也看到,如果说咱们用原始方式写这过程应该并不方便,就是你要把值取出来,然后班号再加一每子,是不是在做更新啊,但是这个过程我们目前用的框架叫买plus。用MP之后,这个过程能够很方便实现,因为它里边把这过程已经给我们做了封装,所以下面给各位都演示一下用MP怎么来实现乐观锁,但是它的底层过程就是咱们说的这个流程,所以现在把这个原理和方案给各位做这个说明,那我下面给大家就演示一下MP怎么实现乐观所能这么一个过程。
09:22
那我下面来演示一下,首先先看下我的课件中,咱看这怎么做啊。我这里边写一下,首先第一步呢,咱们表里面是不是要加个字段,然后我实习类中是不是加个属性啊,加上之后咱们需要在里边呢,配置一个叫乐观锁一个插件,这插件是MT中给咱封装的,咱把它配置之后再来实验,这过程会特别方便,那下面我们就来一起写一下FP实现乐观锁这个过程。那现在我给各位来做一下啊,首先我写一下步骤,就是我们用MP实现乐观锁,那怎么做呢?首先里边的第一步咱做法就是在我们的表里边先添加一个字段,让它作为咱这个。
10:15
版本号,然后加上之后,在我们这个表对应的实体类里边再添加上版本号的这个属性,所以这是里边的第一步,咱们加上字段,然后加上属性,那我下面给各位快速加强,首先第一个咱来到表里边,在表里边咱直接通过工具在表里边先加上一个属性,我们给他来加下。我们把这个打开,然后在里边呢加上一个属性,我们起名加一个字段啊,我们起名叫version,然后指一个类型,比如我们用一个定类型,现在这就加上了,就是在表里边加上一个字段,然后加上之后我们现在在我们对应的实体类里边再加上一个属性,那我加到下边,我来一个private。
11:10
In tIgEr,我们叫version,所以这就是我们的第一步,咱们把它就快速完成了,这各位能给套快速做到,然后这步做到之后,下面我们再进入到第二步,然后第二步怎么做呢?给各位来说一下,因为咱们现在用的是MP实现乐观锁,所以咱需要在我们实际类上边进行版本号操作的使用,上边加上一个注解,这注解就叫做version,那我来加一下,我写一下第二步。在实体类里边进行版本号操作的属性上边添加上一个注解。那我给各位快速加下,咱们找到我的这类属性,我上面加上一个注解,这注解就叫做。
12:00
Version。就是它,然后把它加上,这一步我们就完成了,这就是我们的第二步操作。然后这个完成之后,下面呢,我们再进入到第三步,第三步怎么做呢?咱就需要配置一个MP中的乐观锁的插件就可以了。和写下乐观所搭建,那怎么配置给各位说一下啊,因为咱们现在用的是部工程,如果说你建的是一个普通的这一个项目,那我们在叉买lo配置文件中加个b class是不可以的,但是目前咱用的布的工程,所以他为了方便,就是我第一个我可以在我的启动类里边加一个注解叫这个B。然后进行一个配置,这么做可以,但咱一般把这种配置都放到一个配置类中,咱一般不见写到品类中,所以我现在在里边呢,我就创建一个包,然后比如这个包我叫con。
13:02
然后在包里边呢,我就写上一个配置类,我起个名字就叫这个MP。然后在里边呢,让它做一个配置类,配置类在中我们切法就是加上一个叫configuration。然后在里边我把那个几动类里边的map看给它也拿过来,咱都放到胚类中这个。然后洗完之后,在这个配类中咱们配置一个乐观锁的插件就可以了,我把这插件从我的课件中给它直接复制过来,是这么一个插件。也就是谬一个乐观锁定对象,咱通过艾特B这个注解在里边谬上一个乐观锁插件,所以这样的话,这一步就完成了,这就是我们里边的第三步操作,配置乐观锁的插件。这样的话,我们就完成了这个操作,然后这个做到之后,咱们最后一步呢,肯定就是进行测试了,那咱最后来测试一下,其实目前到这步为止,咱这功能也就已经完成了,但是咱为了一会儿更加明显,我再做改进,比如我这么来做啊。
14:15
大家注意啊,我在上面呢,我再加个注解table build,然后里边呢,把这个加上。我说各位这个是否记得咱们刚讲过,我们是不是做那个自动填充啊,比如说我们实现当我添加的时候呢,让version就有一个默认值,因为它默认没有值,我给他来一个默认值,然后加上之后,咱需要在我们那个实现类里面再加上一个规则。加上以side field we by name加,这个叫version。然后它的值就是1MIGHT or这个对象,所以咱们把这个加上了,就是当我们一添加让version version值就是一,然后方便咱们操作。
15:00
这样的话,这些工作都完成了,完成之后呢,最后我们来做个测试,我写一下测试乐观锁。咱们来做测试,那我写个方法艾特。Test。Public。Test,这个乐观所把这个我们来做一个最终的这么一个测试,给它起个名字,也就叫这个名字,这个locker。打过来。然后在里边写一下这个最终测试,那怎么测试呢?给各位强调一下啊,因为刚才我提到咱们是在并发情况下是会出现这个问题,我们现在与我只有自己测试没法。演示的一个并发,但是我们能看效果,因为大家注意,比如说我们每次更新的时候,我这个数据是不会加一啊,比如第一次值是一,当你更新之后,值是不是能变成二了,当你变成二之后,证明乐观锁是不是就生效了,所以我们就这么测试,那这个测试方式其是咱做的就是一个就该操作。
16:05
但是这个修改跟之前不太一样,咱之前修改是不是直接设置值啊,就是修改大家应该知道我们正确修改应该怎么做。你说怎么修改,首先先怎么做。是不是先查询再改呀,所以咱们现在我就先做个查询再改,为什么查?因为我要得到version的原始值,在原始值基础之上,是不是要加阴影,所以咱们要先查然后再改,所以我现在做个操作第一步。我先根据ID先查询,然后第二步再做一个修改,那我们来查一下啊,咱就调这个user map中有一个方法,大家看这方法它叫做这个。摆ID,然后里边呢,传入你的ID值,比如说咱们一会儿我传ID值,我先写一个,一会儿咱来改啊传ID值,然后这个大家看它返回的是一个对象,咱向对象中可以设置你要修改那个值,比如说我们现在改这个name,要改成这个,改成就是张三。
17:15
然后改完之后,咱就可以调用user map里边的这个方法。里边这方法叫阿贝特摆地把它穿进去,这样的话就可以完成一个修改,咱们也能演示出乐观锁效果,先查代改,然后改完之后它的版本号会加一,我这里强调啊,这个位置呢,你不需要手动set version,有同学可能会想我手动把这个version得到,然后是不是再加一啊,这思路是对的,但是目前这过程MP在插件中帮我们做了,不需要咱们手动做这事情,这个比较明确,所以现在就写完了,写完之后咱们加一个数据啊,比如现在我加一个名字叫这个李四。
18:00
把这值先加进去,然后再用它做个修改。咱就测试一下乐观锁,我们先压一条数据显示一下哈。然后第二个过程中,因为刚才我写了字母填充,咱让version值默认应该是不是一,就是这个值,那咱们看一下这条数据。是加进来了version是不是一现在我把里次这条记录咱们做一个修改,我在这里边把这个ID值改成咱们新加的这个值,然后把这个代码我们再执行一下,测试一下乐观锁,咱看一下效果啊。所以各位应该知道哈,如果效果正确,那这名字是不是改成正三,这个值是不是应该会变成二,就证明咱乐观所就可以生效,那咱们给他最终试一下啊,展示下效果,我到里边刷新。大家看改成了张三,这值是不是就二了,所以证明咱们乐观所是不是成效了,包括你看它比成了雨中先查询,然后再做了一个修改,然后修改中把这值做了一个变化,就把这个值给它。
19:10
是不是加了二对他做了一个就这个操作,所以这样的话呢,咱们就完成了MP中的这个特性,就是关于乐观锁的这么一个使用,各位把这过程要给他掌握。所以这个我们就演示完成了,然后演示完成之后,后面给大家再来演示it实验,一些简单的查询,包括删除功能,包括一些复杂的产品功能,咱们现在先把乐观锁各位先给他掌握。
我来说两句