00:00
服务启动成功之后,我们来去看一下浏览器,我们来去刷新一下。最终我们来看库存中的变化,他已经减了一点库存,班本号呢也加了一个。那我们再来多刷新两次,刷新刷新好,那么此时我们的库存应该又减了两件,库存八米号呢,又加了二。那说明咱代码呢,写的好像没有问题了。那我们来去压力测试一下。看看会怎么样。那么此时呢?我们来去运行压力测试。啊,库存我虽然没改啊。没改的原因呢,是因为咱压根就减不掉5000元库存,因为此时我发了几个请求之后呀。他就已经出现错误了,你大部分请求都已经出错了。来看这个程序控制台,你控制台上已经报出异常来了。在把其中一个服务呢给停掉,来锁定我们的异常信息啊,另外一个服务呢,还在运行着呢,他们一直在报这个错误。来看看这个错误,什么错误啊,先看一下这什么错呢?这是什么占内存溢出。
01:06
那么另外一个错呀,它也是一个战略经济图啊,因为呢,我们这里呢,是一个递归调用,它每次重试,每次重试总是失败啊,一直递归一直递归。最终导致我们的在。内存溢出了。啊,那么这个呢,第二个客户端还在这刷着呢。刷到最后就会报另外一个错误,咱可以呢,把第二个服务也给停掉了啊来看第二个服务里面又有什么变化,你看后续的话呢,它会变成另外一个错误。讲的叫circle connection except,那连接呢,已经超时。那么多长时间呢?30秒超时了。那么很多连接呢,执行的执行者30秒超时了,那么这里呢,其实是有两个问题啊,一个是DV调用可能会导导致我们的战略存析出,因为它不停的从事,那么我们的我们知道方法的执行呢,就是一个出战入账的过程啊,假如说我这就是一个站。
02:02
那么每执行,每执行一个方法,他就会向我们的站里面来,去入一个战队。那么然后我每次重试的时候,又会再调这个方法,那这个方法呢,又会再去入一个战争。最终导致我整个占,然后呢,占满了,满了之后呢,就会导致这个内存啊,占内存已出错误。那么我们为了避免这种情况啊,咱往往呢,可以选择呢,去睡一会儿,再来一个three,点上sleep,也就睡一个20毫秒。那么睡醒了之后呢,哎,等其他啊,等待其他人呢,先去试啊,先去操作一下,我睡一会儿呢,再起来重试。那么这样的话就可以尽量避免出现占占内存溢出了啊,我们可以来一个开处理一下这个异常。那么然后呢?呃,运行着运行着又会出现另外一个错误,就是连接超时,刚才我们已经看到了。
03:00
那么这个连接超时是怎么回事呢?啊,这因为我们的事物注解导致的,啊,相当于呢,我们开启了一个手动事物,那么手动事物呀,它就是怎么回事呢?那我们整个这一块代码全部作为整体的一个事物了。那我们的锁呀,它只有在事物提交之后才会去释放。如果我这是一个手动事物的话,开启事务的话啊,那么一开始呢,我查询并没有加速。当我执行到更新这个位置的时候,它就会怎么样,它就会去加速,因为MDL操作呀,就那个更新。啊,新增新增,然后以及删除操作啊,删除操作这种MDL操作,它会默认就会加速。那么一旦加锁之后。那么咱整个啊,后续代码你不停的进行重试,不停重试,那么它这个数据呢,一直被你锁着呢。
04:00
那后续请求的话呢,就会就变成阻塞了,就变成阻塞了。那么阻塞30秒之后呢,诶,它就会报我们的连接超时。因为默认呢是30秒超时啊。二是咱们啊,这里个玩意儿。所以呢,哎,第二个问题啊,是我们这个事物注解导致的,大家可以把这个事物注解呢。给它注释掉,注释掉之后呀,那我们的这个update它也会锁定,锁定数据也会加倍关锁。但他被关锁的这个力度就不一样了啊。那么当我这个更新我没有手动事务的情况下,它自动失误执行更新的时候,会有事物有锁啊,那么执行完这句话之后呢,诶,我执行失败了,他立马把这条记录的锁给释放掉了,那他就不会阻塞后续请求。那么你就可以解决咱第二个问题。啊,那么一个呢,再加一个睡眠时间,那么还有呢,我们不要去加这个事物注解,那么一定不要注意了。
05:07
那么改完这两个问题之后,我们来去重新启动咱们这两台服务,那来重启第一个服务,那再重启啊咱们的第二个服务。好,那么咱们再去找到我们的压力测试工具,把它呢给清掉啊清掉,然后呢,再把数据库改回5000件库存。五千点库存改好之后呢,我们打开压力测试工具,我们来去运行压力测试。那么此时我们可以发现啊,它的吞吐量呢?吞吐量变得越来越小了。A,它跟我们其他所不太一样,其他锁的话呢,会越来越高,而它的话呢是越来越低啊,而这也是我们乐观锁的一个特征。在并发量越来越高的情况下,它吞吐量呢会越来越低。那么最终呢,我们的5000件库存应该都已经减完了啊,那错误率呢,是0%。
06:04
那到底有没有减为零的库存,我们来去刷新,可以看到库存呢,已经减为零了。那说明咱们写的这个。啊,乐观锁呀,哎,确实就没啥问题了啊。那么一定要注意两点,一个呢是不能加事物注解,然后还有呢就是不要啊,不要这里直接去重试啊,在可以当中呢,睡一会,以避免占内存溢除。嗯。
我来说两句