00:00
接下来呢,我们来看代码该怎么去写,那么在写代码的过程中,我们可以参照指定的玩法来去改造我们的代码。首先在查询库存之前,我们可以先写一个watch啊,以对我们的库存数量啊完成锁定。啊,完全锁定,但这个锁定啊,它并不是说不能改啊。啊是可以改的,其他人可以改,只是改了呢,我这里呢就会取消啊。好,那我们应该在咱们的get之前来去加一个watch,在这个地方好来一个watch。那么然后呢,我们再来看啊,Watch完了再去get,那get完了那肯定要去判断库存是否充足。啊,看这个库存数量是不是大于我要购买的数量。那么如果大于我在执行扣减扣之前要去开启一个母体事物。然后呢,在我们扣减完成之后呢,来一个Z。来执行事务。
01:01
那么也就是说在我扣减库存前后,咱们应该加一个Mo啊,然后呢,在扣减之后呢,再来一个it啊这样的一个玩意儿。它咱有没有对应的方法可以去实现呢?好,我们可以看一下啊,那么this4.ready汉特点上人呢,有没有定的方法,有你有这个watch方法,有Mo方法,用方法。那我们这里呢,咱就使用word,那么监听它的值,看它值呢,会不会在事物之过程中发生变化。那么监听好之后呀,来可以查询,那么查询完之后呢,来去判断啊,咱通过程序来判断的。然后呢,在执行扣减分之前,来一个Mo,类似点right,然后点上Mo啊,开启我们的食物。那最后呢,我们要以执行事物,这应该是雷似点ready碳的点上啊。
02:06
好,那我们这个代码呢,好像就改造好了。那么改造好之后呢,我们来去重新启动我们这两个服务,那么先把服务一呢给启动起来,然后再把服务二呢,我们给它启动起来。啊,两个服务的启动。应该都没什么问题,那这服务二呢已经启动好了,服务一呢也已经启动好了,弄好之后呢,我们来打开浏览器,我们来去刷新。我发现我们发现啊,报错了。那么这是什么错?我们就要去看控制台了,因为500是服务器端错误啊,大家看服务器端的控制台。在控制台上那报了一个这样的错误,他说指令执行异常。那么错误啊,经行什么错误呢?经行Z这个指令的时候说错了,他说没有目这个指令。那我在XQ之前,XQ之前。
03:03
Ex,之前明明是有这个Mo的啊。那么为什么还说没有moty呢?好,那么原因呢?是我们的用法不对。我们不能这样想当然的来去使用我们的what not和啊。它的使用呢,哎,就比较麻烦了。我们要使用这样的一个东西来实现啊,来一个this.right time,点上有一个excu这样的一个方法。那么这个方法里面大家可以接触很多类型的参数啊,其中有一个类型的是c call back啊这样的一个东西。打开进去看看是什么东西啊。那么这个c call back就这个玩意儿,那打开呢,我们来一点开这个c call back到底是啥哈,来认识一下认识一下。那么这是个什么东西呢?他说呀,啊,这个呢,上面有说明啊,他说允许事物。
04:01
啊,那么执行力也指定的Mo,然后呢,A watch还有。哎,相当于这些指令。就是你允许通过这样的一个对象玩我们的事物,就通过这些指引玩事物的时候。大家可以通过它。哎,刚好呢,就是我们想要的这些指令。所以呢,我们一定要通过这个对象来以执行这些指令才可以啊,否则呢,他就不认了。好,那我们呢,怎么去写呢,它是一个接口,你可以直接去new一个叫做c call back,通过这种匿名内部类啊来去实现。那么这里呢,咱们啊,可以呢,去写上它里面这个抽象方法啊,来实现它里面抽象方法。那么这个泛型啊,咱都可以不要了啊,给它删掉,这是KV泛型,干掉他们。那么干了他们之后呀,那咱代码该怎么办呢?那代码呀,咱之前这么去写的哈。
05:02
那么现在呢,我们可以把它给移进去看看啊,诶好像还移不动,咱可以呢,直接剪切进去啊,给它放在我们这个里面去。那分离之后呢,我们需要去稍微改造一下啊,那比如说呢,我们这个地方就没有this.ready ready了。那么你要使用什么东西呢?你要是用,那你可以这样去用。因为在这个匿名内部类里面,Z是指谁呢?是指这个匿名内部类了。好,那么在匿名内部类里面有我们的this.ready ready吗?没有一,它就会报错。啊,你把this给去掉啊就好用了。但是呢,也不推荐这样去用啊。啊,因为呢,它给咱提供了一个叫RA op的一个参数。那么这个参数是个什么东西呢?
06:00
它本质呀,就是我们的。那么以及呢,String ready。嗯,所以呢,我们就不要去使用咱们这个,呃,咱们这个ready碳排的了啊,咱们就使用它内部的这个ready碳排就行了。啊,把它给放在我们的这个地方,叫operations,这是一个接口抽象啊。然后呢,这个地方也是一样的,替换成operations。然后呢,下面呢,包括这个地方我们都要给它替换掉this点啊,这是operations以及呢。它也是operations,然后是operations。好,那么要注意啊,我们尽量改造好之后呀,到底我这个库存有没有扣减成功。或者我在握监听的过程中,握的过程中,那么它的值有没有发生变化,一旦死后值所有的值发生变化了,那我这个减库存不就失败了吗?
07:05
那我失败的情况下应该怎么样呢?应该重试。啊,我们可以呢,根据这个exist的返回结果集来判断啊,如果exist的返回结果集是一个空的结果集。那顺盘呢,说明咱们扣减库存执行失败了。啊,如果执行结果及不为空。环境它里面有一个元素,那是不是还能说明执行成功了呀。现在我们只要拿到的反面结果集。好,来一个也是一课,这是一个历史的集合,我们了解判空一下。来一个A判断。啊,It它是一个集合呀,如果它不等于,或者说等于呢,等于呢,或者呢也啊size。点S,如果等于零说明啥呢?说明咱们的这个事物呢,进行失败了,我们要进行重试,那所以了,重试咱们就执行抵代的方法不就行了吗。
08:05
那这样就可以重事了啊。那么如果执行成功的情况下,咱去那是这个Z这样的一个玩意儿啊,把它给出去啊。啊,那么这样呢,他就嗯结束执行了。好,那代码呢,就已经改造好了啊,稍微麻烦了一点。好,这是咱执行事务啊,这个地方啊,执行事务。如果执行事物的返回,如果执行事物的返回结果及为空,那么则代表减库存失败,那么咱则怎么样呢?进行重试对吧?进行重试。那么这个重试呢,你也可以让他睡一会再进行重试啊,如果你要是不停的重试的话,它是一种递归调用啊,就可会导致占内存溢出。
09:02
那么咱这里呢,可以来一个瑞点上sleep。比如咱就睡一个啊,40毫秒啊。那么具体睡多长时间,取决于你计算机的性能。对吧,那如果你的计算机性能高一点,你可以睡的稍微短一点哈,如果你的计算机性能比较低,你可以睡的时间长一点。但是即使睡得再长,依然有可能呢会出错,因为呢,有的同学呀,计算机性能非常差。然后呢,压根呢,它又支撑不了这么高的丙发量。也可能会报错。啊,那么也是取决于你的计算机性能啊,如果你的计算机性能比较差,那你可以不用压5000个请求,比如说你可以压2000个,压1000个,压500个都可以。啊,那么在这个地方呢,咱可以处理一下这个异常啊,来一个TRY。好,那么咱们代码呢,啊,就真的写好了。那么写好之后呢,我们来去。试一下啊,来再次去重新启动我们这两个服务啊,重启服务一,然后再重启服务二。
10:06
重启好之后,我们来看浏览器好不好用啊,哎,它这里呢,启动都没啥问题,我们来去刷一下浏览器。这已已经执行成功。那么执行成功之后呢,我们再通过压力测试工具可以压一下。我们改造之前,我们改造之前它可能会出现超卖现象。那我们的库存数量咱给他还原一下啊,来我看一下这个库存数量,来一个set talk就设置回5000。回到5000之后呢,打开压力测试工具,把这个呢全部给它清空掉,清空掉之后呢,我们再来去云运行压力测试工具。好来看怎么样,你这个速度呢。啊,它是下降了非常多啊,之前呢,可以达到将近3000的并发量。加了这个乐观锁之后啊,这性能呢,就不到400。
11:00
那么这种库存来看有没有减为零哈,我们来一个get指令,Stock已经减为零了。说明咱的乐观所算法确实可以解决啊。咱们的并发性问题。
我来说两句