00:00
好,同学们,那接下来的话呢,我们来做一部分的补充,通过前面的讲解啊,大家呢,应该是能够快速的上手,起码现在知道西塔是个什么东西,能够用一个西塔来做一下我们相应的对于全局事物的一种异常控制啊,那之前的话呢,我担心呢时间不够,但是呢,同学们呢,现在呢是呃。要我压缩课堂练习时间,多加一点讲课时间,那么好,这部分呢,我就先提前一部分呢,拿出来呢,给大家再讲一下,因为这部分啊,本来是放在这个第三季的,这个内部资料呢,先给你们啊,至于说正式发布后面的事儿,反正你们呢,先看着第三季,保证大家疫情过后找工作,找工资的话呢。没问题,有杨哥呢,听懂了吧,好。话不多讲,那么接下来业务背景这些东西我再不我就不再赘述。那么。提出来一部分,因为大家呢,这个西塔对于分布式事务的处理,跟面试官聊的话呢,也是一个亮点,那假设他一定会考你,你工作中碰上了一些什么样的技术难题啊等等的,对吧,那么同学们。
01:11
下订单,减库存,扣余额,改状态这四步你是怎么做的?控制了解了西塔以及它的底层原理,那么跟面试官说一下,我认为应该是个加分线,好那么同学们接下来跟着杨哥走在辛苦一下哈,我们把上面的运用啊,本来呢是放在第第三季给你们内部资料讲啊,视频给大家,但是现在你们要这么说的话呢,我们就再讲一点,好那么同学们。因为部分同学也刚才那个也问我说。刚才我们见了以后,安度安度安度。都明白回退日志表对吧,那么怎么个体现要求我呢,再加深一点,好,那么兄弟们走起,首先啊,我们呢,来做一下最终的讲解和补充,首先说西塔啊。
02:05
第一个。19年一月份差不多就是。阿里巴巴旗下的蚂蚁金服。可以这么讲,就是。蚂蚁弄出来的,因为他主要是做金融业务,对于钱小钱钱这个事儿那是比较在意的,而且支付宝啊等等啊,你就是错一分钱。和错1万块钱,它的效果是一样,说明你的系统不被信任。所以说呢,多年的磨砺以后,19年一月份他开源了,当时的时候还没有到我们的0.9版,听懂了吧,又各种跟开源社区哈,磨合了以后慢慢的出来。那么西塔的全称呢?就是这个。简单、可扩展的自制事务。框架,那么这个时候这个框架目前请同学们务必掌握,确实不错,要求同学们从2020年啊,因为杨哥呢是跟的早,我大概是从零点五一直玩到0.9,但是请大家2020年三月份以后上班了以后,你必须给我去用。
03:10
1.0以后GA这个版本进公司啊,用这个版本开始啊。教学和工作要有一个区分,那杨哥你你你2019年12月21号的时候就有1.0,你为什么那个那个时候我背这门课的时候,这哥们还没出来呢,听懂,那么下来的问题呢,就是0.9不影响你学习,但是商用的时候为什么没有讲这个呢?因为阿里云呢,你记着世界上没有那么多活雷锋,哎呀,我们要开源,我们要做什么贡献啊,这这扯淡基本上都是嘴巴上说的是主义,心里面想的全是生意,0.9呢。他呢?不支持集群,听懂了吧,你无法大规模商用,你是小产的话,你用用可以,第二个阿里现在下一个业务增长点是什么?阿里云。说白了,我现在开源这些西塔,就是让你们这些Java程序员上手中毒,好比大家现在都用从eclipse签到idea idea是不是?
04:10
上个月和一月份二份是不是经常报那个2019版的注册编码过期那个事儿。一句话文的就叫什么。此树是我在,是此路是我开,听懂了吧,那么五大就是付费,所以说请弟兄们要明白。工作以后请用1.0以后的版本啊,当然后面的话呢,你他主要是要推他的阿里云呢,有个商用啊,他把这个西塔改成了一个叫GTS啊,明白了吗?那么这个G是哪个呢?就是这个GGTS现在在阿里云上面,你要付钱的话呢,大规模商用是可以的,OK,好,那么这就给大家说一下,你自己玩的时候用零就是0.9小产也可以上用,你没有那么大的。我觉得呢,也没有必要花这个钱,但是如果你是大厂中产哈,对于分布式数的解决整个西塔,那么这个时候是非诚合适的,反正钱老板出啊,工作以后用1.0版好。
05:08
下面再看看我们前面。我们讲了我们的一句话,都清楚这个业务流程了,订单、库存、余额三个数据库,那么这个时候请同学们再来看一下我们的TCTM和RM。看他的官网你都清楚啊,TC叫事物的协调者,TM叫事物的控制者,RM叫资源,说白了大家看订单。库存余额。杨哥,这个图我见过了,但是我现在也听你讲过了,还是有点模模糊糊,什么TTMM,那么这个时候杨哥呢,再带着大家呢,来复习一下,我用一句话给你讲明白。听好,现在大家都清楚啊。我们这儿是不是有个TC叫全局协调?管理者明白这个东东,可以把它理解为就是我们的西塔服务器。
06:06
OK。说穿了就是我们在。电脑上启动了以后,是不是有一个叫西塔3.bat这哥们就是TC,他来负责全局管控,他来负责全局抄底,没问题了吧?那么这个就是我们的TC,好,那杨哥TM是什么?能不能一句话讲明白?回到我们的代码听着。哪个脑袋上标了这个注解,这个就是事物的发起方,它就是TM明白。那么换句话说,你可以把它近似的理解为现在PM啊,就是谁脑袋上标了这个,它可以把它当做事物的发起方,这么说听懂了吗?好,这是TM,那么这两个整明白了以后,兄弟们,咱们剩下的是不是就是我们的RM了?
07:01
你可以把它近似的理解为一个数据库就是一个RM,那么在这兄弟们,我们的RM是不是由三坨构成呢?没问题吧,也就是我们的订单、库存账户这三个库,那么TCTMRM,那么既然有事物的发起方回答我。这边应该是叫什么方案,思考一下这个是不是就是我们的事物的什么东东。参与方。能跟上,那么有也就是说谁标了这个,它是不是就像一个,我们编程是不是有一种东西叫什么。大括号一样的这儿。哪来的这个,就是这个,他来发起管着谁啊,管着这三坨,那么他们这三坨就是被全部包圆了,这么说能跟上统一的从西塔来负责协调,所谓的协调就是他们是不是应该有一个统一的XID,那么好,这是我们最经典的最简单的理解,兄弟们请看这是不是有还有什么分支提交那么注册分支啊,那么这个分支怎么体现什么鬼意思啊,那么这我们呢?
08:18
马上进一步深度的给大家讲解来,那么这个时候三大组件啊,这个是他官话啊,那么我们说人话就这么回事,这个就是T事物的发起,谁带着这个谁惹的事,谁开的第一枪,谁挑的头,这个就是由他来做TOK,但是他自己我们的订单库也是一个RM,因为有个订单库好,那么弟兄们再说一下分布式事务的执行流程。第一个。TM开启分布式事物,那就像我说的写个大括号,这是不是应该有,那么所以说TM你加了这个才叫开启,不加这个是不是叫不开启啊,OK,那么好。
09:03
第二步我们看,那么也就是说按照业务场景编排数据库、服务等事物的内部资源,RM向TC汇报资源的准备情况,那么好了。我讲过了,这个相当于班主任李金龙,这个相当于杨哥,这个是不是来听课的学生,你们是不是要跟我聊同一个课堂,比方说我们的cid就是class ID。那么这个时候是不我们网络课堂上输入同一个课堂艾特硅谷CLASS190805叉叉叉AB什么的一大堆序列号,大家进来听课,你们是不是是授课的参与方?OK吧,好,那么TM结束分布式事务,事务一阶段结束,TM通知TC是提交还是回滚?那么听一段时间以后,下不下课,上不上课,由班主任好,今天的学习到这儿,他来负责喊话。TC汇总事务信息,决定分布式事务是提交还是回滚。那么TM来看。
10:02
有没有什么问题,听懂了吗?天,有没有什么问题听懂了吗?有没有什么问题听懂了吗?没事儿。干嘛?就是有事起奏,无事退槽,那么换句话说,正常就卡大家一块提交,交作业,有异常的回滚。那么TC通知所有的RM,要么一起提交,要么一起回滚,那么事物的二阶段结束,杨哥,什么叫事物的一阶段,什么叫事物的二阶段?好,那么这个是他官网上的一个步骤,别着急。我们呢,一步步走,那么接下来我们要明白西塔,我们请看它这个官网,它呢,什么概念,我们先翻到首页来。A模式,PCCC模式,Xa模式,还有萨GA模式,1234,哦,原来西塔它是有四大模式啊,那杨哥讲人话,我现在用的是哪个,默认他用的是at叫无侵入或者叫第一侵入自动补偿的事务模式啊,就叫at模式啊,明白,那么这个开发中不废话了,那么TC和这个注意尝事物提供有效的解决方案,明白那么好,现在话不多讲,我们回到我们的文档,那么大家请看。
11:22
C塔是巴拉巴拉巴拉最多提供了这么这四大模式啊,为用户打造一站式的分布式。解决方案,那么大家请看。At模式啊,来自于官网啊,我就不再反复切换了,一,现在我们用的就是它主流主推的at模式啊,这个东东说白了,如果你要花钱可以用商用,就要用它的花钱付费版啊,现在我们用的是at模式啊,那么上去以后是阿里云,这个时候他用的叫GTS,这么说能跟上,还那句话,人家毕竟是要吃饭赚钱的,阿里程序员工资那么高,哪来的,人家不是开慈善机构,给你免费用哪那么多开源,开源的前提就跟腾讯的QQ免费一样,最终是不是装备要收钱的,OK,那么希望大家呢,切记啊,那么好的效果,毕竟嘛,免费玩家你打不过人民币充值玩家。
12:17
江湖规矩都这样,OK,好,那么接下来走起这什么呀,那么什么一阶段二阶段来,首先at模式一阶段业务数据和回滚日志记录在同一个本地事务中,提交兄弟们。大,我现在订单库,库存库和我们的账户库是不是都有自己的业务表,加有一个回滚的,听懂了吗?释放本地锁和连接资源,杨哥,什么本地锁我没见到一张锁表啊,有没有发现有个东西叫洛克忒宝,还有全局,还有诶分支啊,待会来说,别忘了现在这个是不是西塔服务器,这个是被西塔保护起来的,你需要做分布式事物的各大单一的数据库,账户,订单库存好,那么兄弟们走起一阶段加载是这么的,在第一个阶段。
13:13
C塔会拦截业务circleq,它为什么要拦截啊,要执行,注意解析circlel,找到业务circleq,那么要更新的业务数据啊。被更新之前将其保存成image,俗称前置镜像,请看保存原快照叫before image。哎,在执行业务CQ之前,那比如说啊,兄弟们,杨哥现在一干活是不是要先订单create增加啊,这个是不是我的真实的circle,这条circleq我底层100%是要写一条ins色语句,那么这一条不好意思啊,才叫业务circle,但是在我之前会有一个东西叫before image。第二步,你先不要管啊,你先知道现在有这么一个东西是什么,它非常重要,这两个啊,回头我们会说前置circleq比before你卖也叫前置镜像S。
14:10
第二步,执行业务SQL更新,在业务数据更新之后保存成after image,最后生成函锁,哇,原来在一条CQ之前有前置镜像,之后有后置镜像,然后生成行锁,注意。这一圈虚线宽的完成了。以上操作全部在一个数据库事务内完成,保证了一个阶段操作的,什么原子性提交业务,SQL安度或者log函锁,哪跑了一个函锁,兄弟们是不是有一张洛表啊,能跟上好,那么这些你就先明白,这是一阶段,说穿了就是你要干活。三步一。干活前。前置镜像。
15:00
干活后后置镜像,然后生成函索,OK,三步啊,这是一阶段,那么换句话,兄弟们,这个叫什么思想?是不是就是我们spring的a op,类似于前置通知后置通知啊,那杨哥这个before image after image干嘛呢?别着急,第二步提交什么意思呢?GB。如果踹这一切顺利,现在弟兄们都OK是不是卡密只要有其中有一个?除12全体连坐back听到,那么我们先来说提加。来二阶段如果顺利,因为业务CQ在一阶段已经提交到数据库了,所以C塔只需将一阶段保存的快照数据和函锁删掉,完成数据清理即可。什么意思啊,别着急,在这块大家请看这是不是有一个全局的,这是不是有一个分支的?OK,这还有加把锁的西塔,现在你可以把它理解为它是不是要照着这三个。
16:08
账号订单库存好干嘛?删除before image,删除after image就是把前置后置的。两条搜求镜像删掉,然后解锁,听懂不加锁了,我是不是才可以提交吗?好,下面这是正常情况,那么异常呢?二阶段回滚,那么兄弟们这个不是胡说八道啊?官网的C塔二阶段提交异步化非踌快速的完成二阶段提交,如果出异常了,回滚通过一阶段的回滚日志进行反向补偿,我的妈呀,什么叫反向补偿?安度那么好,待会儿会给大家解释啊,这些概念必须要明白,他的思想面试是要聊的,那么二阶段回滚是出事了呢?二阶段如果是回滚的话,C塔需要回滚一阶段已经执行过的业务色调。
17:04
说白了,还原业务数据就是官网上这句话,反向补偿好。回滚方式就要之前的前置镜像还原业务数,业务数据。那么,但是在还原之前要进行校验单写什么意思呢?就是担心别人已经插手动过了,数据就乱了,对比了以后。对,当前的数据和after image如果完全一致,就说明别人没有动过,没有出现过单写,那么你还原,如果不一致,三写了,就需要转人工处理好。我相信听到这,同学们是似懂非懂,懵逼加有点更逼的,甭着急啊。通读一遍,等杨哥debug带着你们断点走下来,然后再来解释其说穿了,他这个就是spring AOP的思想,再加一个什么回退反写机制来处理好校验单写。
18:09
之后的和现在当前的如果是OK,那么呢,就是拿以前的生成逆向搜数据还原,删除什么before image。After image删除锁搞定。听懂,那么这个就是我们的理论,那么下面兄弟们听了一段。代码以后懵懵逼逼的别着急,我呢debug一次以后再给大家来进行详细的讲解。说白了就是这。张这三张图你整明白就清楚C塔的底层工作原理,至于说源码级别的,或者甚至我们干嘛写一个?低配版或者乞丐版的分布式事务框架,那么我们面试题第三季的时候,那么大家可以先去看一下内部资料,后续我们再交流,那么现在先保证大家你们班特殊,马上疫情结束以后要去找工作,我们先来看。
19:09
来杨哥这个从来没见过里面有数据啊,为什么呀。来。22这是失败的时候,提交的时候十二十二听懂来吧,二话不说,先看代码。这个是发起者,谁有global transition呢?谁就发起明白,第二个订单册,他既在这儿发起了以后,订单被管起来,库存被管起来,账户被管起来,最后来更新,那么现在订单库存账户最后一个是账户,那么现在我先暂停的啊,把这个出事的那个我故意超时啊,这随便你,你用超模拟超时异常全局15回滚可以,你再写in特A等于十除以零。
20:00
也可以听到。我这把断点打在这儿,注意肯定要以debug模式启动,这三个听懂了吧?然后呢,老规矩,那么我们前面是不是有这个访问地址啊,我们现在呢,刷新了一下以后,断点是不是打到这儿,断点打到这儿了以后,我们来看看我们这个里面会有一些什么样的东东,好同学们。跑到这儿我刷。来,兄弟们,此时我们可以看到断点是不是打进来了,打进来断点以后,弟兄们请看,现在我们先看我们的西塔库,来看一下我们的这张表,有没有发现一个问题诶。出现了一个东西叫XID,然后ID它有branch ID,分支ID,有没有发现XID是由IP加端口号加2036774054405440544054,说白了兄弟们,这个就是我们的全局IDXID听懂,那么分支ID4056。
21:11
40594062什么概念?最终是不是我们的全局transaction ID就是这的4054,说白了就是这个XID加上我们的分支ID来决定我们的全部啊,听懂这个意思了吗?那么。三条记录说明这次事务是不是有订单库。哪来的?你怎么知道是订单库啊来。你看资源ID,人家是不是给你说的清清楚楚来的是什么C塔的。库存那个库存账户订单听懂了吧?请看分支的类型是不是at,我们是不是说过默认是用at,那么来client it等等等等这一切,兄弟们请看,是不是都有我们的微服务的名字啊,微服务的名字啊,再加我们的IP主西塔主机IP再加,注意11.1,这个都是同一个机器,就是装了西塔服务器的那个,听懂了吧?好,那么兄弟们请看。
22:13
那么再来,我们先来看看我们第一个是不是叫订单,那么下了个订单,那么兄弟们这第77号记录刚下的,再来安度日志啊,请看。是不是有我们的X it加我自己的4056就说明是订单库啊,这就是我的分,我是不是三个里面的1/3,我是一个分支啊,我是一个,我是一个,那么但是我们是不是在同一个XID下面各自不同的分支ID全局是为ID和各自自己的本地事务ID听到,那么下面请看。这个叫context,那么来,大家看roll back in for,听懂这个意思了吗?来,那么杨哥,什么叫back in for呀,Country。AC保存找到我们的工具,这个时候讲什么啊?兄弟们现在是不是还懵逼着,什么叫保存原快照before image和保存新快照after image,什么鬼啊。因为为了恢复我现在这。
23:15
格式化look哪来的分支ID?请看装在这这些巴拉巴拉巴拉请看这是不是有个东西叫before,这是不是有个东西叫after image,那么它的意思就是说你在改动之前。假设你的值是多少,你改动之后你的值又变成多少,我这已经是给你有个小本本记着账呢,这么说能干上?那么请看这句话,什么叫反向补偿,它的意思是这样的,根据我们的抓源码,我们就知道了,这个东东一定会有一个前置后置镜像,明白了吗?那么假设啊。我现在要改一个年龄,那么假设select age from p这张表Y啊,ID等于些,这个就叫前置通知,明白了吗?比方说这个A级现在是等于22岁,好,那么下面请看这个啊。
24:16
我这是不是有个东西叫执行业务,我干一件什么事啊,Up。然后呢?假设这个A,现在我把它变成。28岁这么说能跟上Y啊,ID等于一,那么好,这个就叫业务circleql,没问题吧,那接下来这个闲置SQL,这个叫业务circleq,这个叫什么?后置SQ,那么现在我在查这个一号它的。东东应该是多少值啊,28,所以说我这儿每干一件活,我都用小本本给你记着,并且生成函锁,那么同学们请看,现在跑到这儿,那么订单库有记录有安度啊回答我订单后面是不是减库存,请看库存,这是不是也有他自己的XID和事ID,大家请看这个时候他是不是也有我们之前说过的这个前置和后置通知啊,什么概念库存。
25:22
干嘛来?这个东东找前置的时候,比方说50 50数,就是这个后置的时候就要变成60和40,听懂了吧,那么就跟这儿一样,那么前置后置什么叫反向呢?如果成功了,那么好说,那么如果失败了呢?那么请看我就要来来看看啊,来反补,什么叫反补呢?比方说反向你前面做了音色,我的逆操作,是不是叫比delete塔,听懂了吧?你前面做了update,修改之前的数据是22,修改之后的数据应该变成28,那么这个是我正常提交,如果说。
26:03
我现在修改失败了,那么是不是叫反向update,那么就要把28回退到22,你怎么知道是22,因为前面有一个BEFORE1卖前置镜像记录我修改之前的值是多少,修改之后的值应该是28,如果全体乘高能改我就改成28,那不能改,我是不是应该有回退,回退我就要改回22,因为你前面给我记着账呢,这么说能跟上,那么再回到我们这儿回滚,那么请看。回滚的方法是不是要用比before以麦积还原元素句,我刚才讲过了,用以我这个小DEMO为例,成功了要改成28,那失败了不能改为28,是不是要回退到修改之前的22啊,哪来的?因为有个东西叫before卖还原业务数据。但是还原前首先要跟。校验单写,也就是说就因为啊,不排除有可能高并发的情况下,或者出了异常别人。
27:02
按照我这个应该是改之前是22,改完以后是28,现在不顺利,我要把它改回到22,我要先拿什么。对比当前数据库啊。和after image,如果说我现在啊。28对比了一样,没有人动过,假设有人把它改成32了,那对不住了。我改不回去了,因为我退不了了,别人已经在我之前动过这个版本了,听懂了吗?有点像我们的CS啊,或者说我们的乐观锁,但是现在假设没有人动过,那么我检查了。一致啊,没有单数句,那就说明什么?我可以还原业务数据,听懂了吧?脏数据人工干预处理,没有人动过,没有脏数据我就可以还原数据从28还原到22,这个就是安度的作用,它的作用就是这官网上写的反向补偿。那么from to从哪来到哪去?修改前,修改后,修改成功往前走,修改失败可以往后退,你往后退的数据出处和依据是哪?
28:15
就是这儿给你记录的前置。Before image,记得你修改之前的数量应该是50 50后置,如果修改成功了,你的数量应该是少十个嘛,对不对,多了十个,少了十个就应该是40,否则的话这个数据不对,那么我不对,我就要把它回退到之前的50和50,好,那么弟兄们这个。就是我们的安度,好,那么再来回到我们的账户,那么大家请看这是不是也有我们的同一一个,那么再来这个西塔服务器,大家请看三条,大家请看全局表是哪一个西塔order server什么意思啊,这哥们。肥胖T事物的对不对?那么你看4054,因为这哥们是不是脑袋上加了那个就这货,这哥们脑袋上是不是加了这么一个通道,好,你可以把它当做是起始,是由谁发布的,那么最后落克表锁了谁?三张表全给你锁了,听懂了吧?那么这时候大家请看xidf是这个锁在哪?R key你看还有笑脸对不对?
29:24
账户啊,订单啊,Storage啊,那么这些,那么兄弟们,Look在这块我们都可以看到。4054啊,我们再来看4054啊,你看是不是都是同一个事物IDF,有同一个事物ID,并且有各自的4062,各自的4056。大家看4059是不是各自的分支ID啊,有点类似于这个时候是不是就应该听得懂大的这个这哥们发起的一个参数,比方说这个叫一,下面这三个是不是分别就叫1.1。1.2 1.3,兄弟们没问题了吧,所以说由他来全局控制好,那么。
30:07
这货我们呢,给他全部走完,那么OK,该干嘛干嘛,那么这个时候同学们再来看诶。什么情况?是不是被官网上说的这句话look怎么着?反向补偿完了以后,我们官网上讲过这句话,最终的时候啊,他这工作机制啊,他这上面写一阶段二阶段完了。干嘛?根据安度的前置镜像和业务CQ也说过了,注意二阶段提交了以后,异步任务阶段的分支提交请求,将异步和批量的删除,相应的什么安do做个日志啊,同学们,这个时候我们再来看。几乎可以看一下我们的安度好账户,这还没删掉它异步的啊,但是注意请看这删了吧。
31:00
这是不是通通都给你删除了,这么说能跟上好,那么这块它会后量批量的删除好,那么这个就是我们的二阶段回滚以及每一步它删除before已image删除镜像已image减删除函数,它所保证和处理的相关内容。好,那么debug也带着大家走了一下,那么最终的补充,那么大家就要清楚啊。主要就是要明白前置镜像和后置镜像后面那个安度删除几乎包括啊,这个C塔服务器,他自己删了以后干完活干嘛就说事了,拂衣去,深藏共与名听懂轻轻的我来了,正如轻轻的我走了,你甭找我,哥是一朵云,你不要留恋我,听到就当没出现,那么该删的。删除该做的做完明白好,那么这个时候请大家看,比方说我要做一条业务色求是update,那么业务代理数据源要注意这儿,我们这儿说一下啊,代理数据源就是我们这儿配的啊,这个是我们自己配的,就让他呃结合的用我们自己的啊。
32:12
好,生成了这个CIRC regard,然后生成执行器,那么。前置快照执行,后置快照生成安度表1234啊,比方说刚才非常经典和明显的订单上是不是都看到过啦,完了以后有事,那么。冲突了再来,没事,插入安度卡密特,在事物的这个全局这个里面听到集合,就是杨哥说的11.1 1.2 1.3,完火以后那么干嘛。向TC汇报,分支的阶段一已经完成明白,这个就是我们阶段一的加载,后面就是成功了,全局提交,错误了全局回滚,那么要么一起成功,要么一起失败,那么在这儿就要看前置镜像,后置镜像和我们的数据库,只要防止单写就OK,好,那么同学们,这个就是给大家的一部分补充,更深入的底层源码级别的讲解。那么。
33:11
三季的时候我们再聊好,那么同学们这个说一下面试当中的话呢,请同学们呢。还是要有点说辞和准备。你要对某一个技术,尤其你想去。面试阿里的,说难听点可以先走阿里的外包员工先去接触,慢慢的外包是吧,再跳跳转正,有这个机会的话,那么关键是平台决定技术。那么。除了会用,尽量的要能够会说,更加理得清楚这些理论。好,那么同学们更多的,我们待会聊。
我来说两句