00:00
好,同学们,终于到我们西塔大显身手的时刻,接下来我们的全部的环境已经从数据库到西塔server的安装,到我们三个微服务的编写,并且都已经成功启动,那接下来我们就要根据我们的业务来进行C塔它对应的支持和测试。首先我们呢。还是先来看业务吧。这个大家都熟悉,那么真的能不能像他所说的,只需要加一个global transitional注解,在业务方法上就能搞定全部的事情呢?另外。部分同学刚才也问了,说好像没见过家呀,我是不是写漏了?没有,我们现在先不加,一定是先没有的时候出了哪些问题,然后加了它以后解决这些问题才体现它的价值啊好,那接下来我们的数据库的初始情况啊。注意哪个库的哪张表啊,现在要整清楚了,我们是三个库。
01:01
订单库的订单表现在是空的。OK,因为啊,现在我们还没有下单,所以说这个是个空的,那么现在这是库存库的库存表。一号产品,比方说华为手机有100个,目前卖出去零个。库存剩余100个,那么下面就是账户库的账户表,哪个人的账户,哪个人的钱,现在呢,这个金额总共有1000,用了零,还剩1000 OK吧,那么这个是我们的。数据上的一个初始化,那么数据化初始化呢,在我们这数那个数据库准备的时候啊,同学们,我给大家呢说过基础的数据都这么一执行就OK,如果你把这三个照着我的笔记全部执行完了,那么就如刚才抓图所说,那么就是数据库的初始情况,不放心的,那么同学们我们呢,再来看一下,假设现在这是我们的。订单库的订单表,那那那那那现在没有人下订单吗?库存。现在呢是一百一百,那么这个是账户10001000OK好,那么这个是我们的一个基础的情况,那么下面。
02:09
我们来先说正常下单。那么正常下单的意思这块啊,现在什么都没加呢,听懂了吧,我们就是三种情况,第一种是正常下单,第二种没有加,这个出异常了,随便找啊,运行时异常或者超时异常什么的都可以分母为零,然后呢,数组下标越界,总之的话,你给我折腾事,给我出异常了好,那么。出一场没加这个,看看产生什么灾难性的后果,然后出了一场加这个,看看有没有控制,就三步,第一步正常下单,那我们干的这个事儿呢?2001什么意思啊?2001是不是我们的订单的入口,那所有程序的入口都是先从controller开始,Controller呢是所有业务的接口,那么在这块是不是有个订单create,所以说在这儿就是订单create。屁股上挂一堆参数啊,那么就是假设一号用户买了一号产品,买十个花100块钱,OK,那么下面同学们不说别的,起码现在订单库里面是不是什么都没有。
03:11
走起我们呢,看看我们现在来执行一下,能不能够下单成功,好同学们看到没有,是不是扣200订单创建成功,Date等于,那这个date等于那不是错啊,是因为我程序这因为我们的。com它是传两个参数,如果你没有传第三个,那么这就是个那听懂那么以200为列,200就是成功,那么下面同学们不废话,如果你成功了,你订单库是不是应该有记录啊,弟兄们有没有,那是不是一号。顾客买了一号产品,买了十个,花了100块钱,目前的状态是一,为什么?因为零是待支付,一是已完成已支付,说明最终一个合格、靠谱、正确的订单应该是一。那么自然而然我们来对这个数据。
04:01
既然你这数量是12,那么我的库存这大家请看,之前是100,卖出去十个,是不是还剩90个,那么一样,我们再回到我们的订单,说钱是100,库存是十,对上了说钱是100,我们的账户总共有1000块钱,你用了100块钱,现在是不是还剩900块钱,那么兄弟们最终是不是完成?我们自己的这个service的实现类,那么大家请看,那么这个service实现类我们请看一下是不是开始创建订单,巴拉巴拉这些,最终我们把零改为一啊,那么这块如果不出意外,那么弟兄们我们的2001,那么大家请看一下是不是完整的。这个日志啊就打出来了,弟兄们没问题吧,开始新建订单,然后开始调用库存扣减库存式扣减count数量,然后扣减and,然后再开始调用账户,扣减的是money,然后账户money完成OK吧,然后第四步修改订单状态,开始修改订单状态结束,下订单结束了,哈哈哈,只要后台打出笑脸,那么是不是跟我们前台的200成功是一回事啊,那么这个是我们的正常情况,所以说足以见得,那么我们现在啊,这种程序啊,以后同学们在工作中100%天天就是变这样的了,自己去调自己的DAO,也有可能自己去调别人的service,那么这样就像是什么。
05:32
穿起来,那么这样是要有全局事物,然后为了性能要结合我们讲过的GUUC高并发,那么这样的话是不是才是大厂的互联网技术的基础要求啊,那么在一个create里面,你调的是一堆东西的,这个才是长流程复杂的业务的雏形,听到现在的Java程序员你要拿一万五到2万之间啊,假设两年工作经验以内差不多,这个是你需要懂的,不再是以前就一个调一个service,调单一的一个do,往数据库里面插入一条记录成了就代表成了,那这个差不多是。
06:06
四年前的事儿了吧,好吧,四五年前的事儿了,好,那么同学们下面不废话。接下来我们也看到了我们数据库的这个情况,最终成功的状态是买了十个,用了100块钱,所以说。这两个加起来是不是要跟等于前面这个OK吧,好那么这个叫正常下单,那么加接下来我们来说一下这个异常,而且我们现在根本就没有加过这个,听懂了吧,那么弟兄们我们随便找个情况,比方说账户这块是添加超时,好那么我们为了保证效果,那么账户。2003我先关闭。那么它这这货它是叫这么一个名字啊,我们待会儿给它重启,好同学们找。那么这个时候过来,大家请看我这是不是留了个口子啊,这是扣减账户余额模拟超时异常全局事务,我们希望回滚,但是现在我并没有加,因为我们现在是第二条超时际长了,没加这个听懂,那么。
07:06
超时就很好说了。那么这个时候兄弟们多少直接写个20秒钟,什么业务也不可能忍耐你20秒钟吧,那么这个时候同学们,我们把我们的2003重新启动,那接下来的意思是什么概念?我们同样的调,但是到这一步是不是就被卡着了,那这个时候被卡着说明我们的业务就会出超十几长,为什么前面讲过我们这次调用的东东是open phone phone的话,它的调用默认时间是不是就是一秒钟,那你感情好给我20秒钟,那么自然而然他会报一个。Read timeout timeout这么一个超时异常,那么来达到我们的目的,好,那么同学们请看一下我们的2003成功启动,OK,也注册上去了,那么好同学同学们还是这样的一个地址啊,现在是成功返回给我这个页面,由于我现在没有去做这些什么降级啊,熔断,那么成功就是这个页面错了,可能就是返回一个错误页面I配置好,那么同学们我们。
08:10
直接。再来。怎么样,是不是我们的a page了?大家请看是不是read timeout exception发这么一个post请求出事了,那么来兄弟们,我们接下来就要检查检查我们的数据库啊,首先订单。什么情况,63号订单加进来了,但是他的状态不是一是零零代表未支付,我并没有付钱明白,但是库存请看同学们。怎么着,是不是被扣掉了?库存是不是就对不上了,刚才第一次是不是扣了十个,这次又扣了十个,但是抱歉,你的订单状态不但插入进去了,并且还是零,那么再来看看我们的账户啊,那么兄弟们怎么着?是不是也被扣钱了?而且更加坑爹的是你被扣钱了这些情况不好意思啊,怎么着你的订单状态不OK?
09:07
明白,所以说这个时候来吧,故障情况第一种。账库存和账户金额扣减后,订单状态并没有设置为已完成,没有从零改为一。兄弟们,请看我们的订单状态是不是没有从零改为一?OK,第二个问题,由于还有存在费的重试机制啊,可能账户余额还有可能被多扣,还好啊,我们这儿这次账户余额是两次,可能待会儿你刷着刷着,那这块就会变成多少七百三百,因为分有个超时重试机制啊,明白了吗?又会多扣款,那么我们得到一个效果是什么?如果你不管这个全局,牵扯到的库越多,到后面修数据的故障是不是越恐怖啊?所以说以前你修一个库,Only one,一个数据库都是update语句,你现在修库就不是update语句,而是你要搞清楚这一圈。
10:05
流程谁调谁,这些数据对不对得上,那么请看现在我们的订单状态是零,好,那么下面我们呢,完成了我们的第二步超时异常没有加这个global transition了,那么终于我们加上超时异常添加这个,看看它能不能控制住。那么。上面依旧有这个超时异常的故障,但是现在我们找到我们的order service实现内,那么兄弟们。回到我们这儿,我们现在就要关2001了啊,我为了保证它成功,那么我还是呢先关闭,那么大家请看我们在业务的入口,那么这就会有一个globe。有没有看到这个transitional,那么就有这么一个注解,那么这个时候点进去看,那么兄弟们我们下载一下源码,那么这个时候就会看到它呢,有什么超时这个控制啊等等毫秒对吧,Name default,那么这你要给这个一个。
11:04
Transaction的这么一个全局的事物,有这么一个名称,那么back back for class等等,No back什么意思啊?意思就是说哪些异常?碰到了一定要回滚,而这些是now back for class,什么意思啊?哪些异常碰到了不要回滚,明白,基本上就是照着我们的spring的那个transitional那么一块去做的好,那么兄弟们,那么这块怎么写呢?很简单,就这么一句话就OK。来,这个名字随便你叫,只要是唯一性不冲突就行了,然后back的意思就是什么?你发生了任何异常,你通通给我回滚,OK,那么我这儿就要把你关起来,来看看我们的西塔能不能成功。好,同学们,我们启动我们的2001,那么这个时候等它启动,我们来进行相关的测试,先暂停录屏,同学们,我们继续,我们现在呢,已经完成了我们的订单,从入口开始就加了全局事物控制,那么来看看我们现在还是刚才那样错误的反问,请看有没有控制住啊,前台不要管,那么现在我再一刷。
12:16
转圈说明找到了,那么这个时候过了一会儿不好意思啊,前台还是I配本次的业务是错的,但是关心的是我们的订单现在刷新看到没有,根本就没有插入进来,这么说能跟上,所以说因为为什么你犯异常了,我是不是回滚,回滚以后我根本就没有提交你的斜操作,导致你现在没有错误数据进库,前台发现的L卓配级该做降级,该做异常兜底的去处理,那么这个时候请看我们的库存,大家请看第三次做的没有减少吧,那么这个大家请看我们呢,也没有减少吧。好,所以说这个时候我们就控制住了,从这可以看得出,下单号的数据库并没有改变,记录都添加不进来。那么这个时候同学们是不是完成了我们的这个要求,只需要使用个global transitional注解,在业务方法上就可以解决分布式的。
13:15
跨数据库的多个微服调用之间的全局事务控制问题,这个是目前工作中需要的必备技能,请同学们务必敲代码并掌握好。那么这儿我们就给大家介绍到这儿。
我来说两句