00:00
接下来我们来编写库存的自动解锁代码,首先来到我们的库存服务的controller,先来找到我们所库存的方法,这个controller呢,它是锁库存,最终调用我们这个service来锁库存,我们要说解锁,那首先我们得考虑我们这几种场景,什么情况下要解锁库存,解锁的场景我们有呢,这两种场景,第一种场景首先就是我们这个下订单成功,下订单成功然后呢,但是订单过期没有支付,订单过期没有支付,没有支付被取消了,没有支付被取消,被我们这个系统呢自动取消,被系统自动取消,然后呢,我们要解锁库存,或者呢,被我们这个用户,被用户我们这个手动取消。然后我们这个订单呢,刚下完我不想买了,我点了一个取消订单,我们手动取消了,我们此时呢都要解锁库存,这两个情况呢,都要解锁库存,咱么第一种第二种呢,就是我们之前说的保证一致性的这个复杂方法,那么之前呢,是这么一段代码们来找到我们的下订单方法order的这个service,来找一下order service的实现类,我们来直接CRN,我们叫order service,我们订单的employment,我们之前呢是这样的方法,我们在这儿锁库存,如果我们库存锁成功了,但由于我们这个远程方法出了问题或者什么问题,我们订单呢给回滚了,所以这个时候呢,如果我们使用C塔来做分布式事物,感觉太慢了,所以我们使用最终一致性,我们让它自动解锁库存,所以就是这个时候第二个场景,第二场景我们也来写一下,就是呢,下订单下订单成功,然后呢,库存也成功,库存锁定成功,但是呢,其他。
01:49
业务调用的时候,但是呢,接下来的,接下来的业务调用失败,失败导致订单回滚,导致订单回滚,然后呢,接下来我们之前锁定的库存,之前锁定的库存就要解锁,而这个解锁呢,如果使用西塔分布式事务来做,我们说太慢了,所以呢,我们希望呢,自动解锁,一段时间以后呢,它自动解锁,那么先来看我们的第二个场景,那就是先以它为例,订单呢,下单成功,我们库存的自动解锁,我们来到这一块呢,这一块是锁定库存,然后我们在这我们挨个锁库存,我们先来找一下我们这个商品呢,在哪些仓库都有库存,然后有了,我们就来去这个仓库给它锁定,锁定成功了,我们就跳出接下来试下一个商品,锁定失败了,我们就试下一个仓库,所以呢,现在我们这一块呢,是核心的锁库存方法,那来到这的话呢,我们只要库存锁定成。
02:49
我们看到这呢,有一个锁定成功,只要锁定成功呢,我们就应该发送一个消息,就是呢,告诉MQ,告诉MQ库存锁定成功。
03:00
锁定成功,然后呢,触发它一串的自动解锁逻辑,所以们接下来在这就要发消息,那我们来注入我们的rabbit tableilet,我们发消息呢,要用rabbit tempilet好来注入进来,那么发的消息是什么样的,我们应该发什么样的消息,在这呢来写一下,好们来到后边这一块,我们库存锁定成功,我们将要在这儿来发消息,但呢,发消息之前来引入商这么一个流程,来看我们这一块订单的这个锁库存流程,库存以前锁定成功们只是下边的流程,我们应该呢,再加上上边只要有一个库存锁成功了,我们就应该保存它的库存工作单,对应我们数据库里边有这两两张表,一个叫库存工作单和库存工作单详情表,库存工作单表示我们要为某一个订单准备要锁库存了,然后呢,详情表就是表示那我们这个订单哪个商品锁了几件库存,当然在哪个仓库锁的,我们也。
04:01
应该加上,那这呢给它添加上两个属性,第二个呢,是仓库的ID,代表我们是在哪个仓库写的锁的,然后呢,它是一个贝格int,我们这个20,这是我们指定的这个仓库ID,那么再来加上呢,我们当前的这个锁定状态,比如我们这个到底锁的怎么样了,To lock status,我们这个锁定状态呢,我们来写写一个int,长度呢,就是01234之类的,比如我们这个零,诶我们写一个一,一呢就代表我们这个已经锁定了,二比如就代表我们已经解锁了,我们这个三,就代表我们这个库存呢,已经扣减了,这三个状态分别是什么意思?锁定就是我们刚预占了库存,然后呢,二解锁了,相当于我们把这个预占的库存给解锁了,三扣减,就是我们这个呢,已经去真实的把库存给扣减了,比如我们这呢,就引入了多天的两个字段,那么来到库存工作单的。
05:01
详情里边来找一下这个实体类里边库存工作单这个详情,详情在这,那再给它添上两个字段,第一个是private long类型的仓库ID wherer ID代表呢,我们是在哪个仓库锁的这个仓库ID,再来加上我们的这个状态,当前的这个锁定状态integer,好integer类型的么?这一块呢,属性们一定要跟着它的这个属性来,那是叫lock status好,我们来加上它,包括我们这个,一旦这一块变了以后,我们的锁定状态,锁定状态一旦我们这一块变了以后呢,我们一定要修改它的这个map文件,我们来找到这个map,这个data do,我们这个do的这个map,这个map呢,原来只有这几个属性,我们再来填上说它的这个结果集里边封装的时候呢,再来封装上两个,第一个呢,是我们属性扎宾里边的属性。就是我们的仓库ID对应我们数据库里边的列,列呢就是仓库ID ctrl c复制过来,然后呢,扎B里边的属性,我们锁定的状态对应我们列里边,就是这个锁定状态,我们把这儿呢改上两处,然后接下来我们只要库存要锁库存来看一下我们库存服务在这好。
06:22
库存呢,一旦一进来想要准备锁库存,我们先呢给它保存一下库存工作单的详情们好,我们现在呢,在这来保存库存工作单,工作单的详情,引入这个库存工作单,我们其实呢,就是为了追溯,来追溯哪个仓库呢都哪一块当时锁了多少,包括一旦出问题,我们人为的可能回滚也方便,好我们先把这个库存工作单们来保存起来,这个工作单呢,要操作我们这两个Du,我们就来准备过来,那么直接来准备他们的这个service,库存工作单的service一个是where,那么这个order,订单的这个task service,好,Where order task service,那就叫工作单订单工作单的这个service,另外一个呢是where,那么这个叫order detail service,好,那么order task detail service,那这两个service来加上,然后呢,接下来来指定,现在呢,我们只要一锁库存。
07:22
我们一进来准备锁库存,来看一下锁库存的方法,在下边一进来想要锁库存,那先来保存第一个大信息,就是呢,先给这张表里边保存我们是哪个订单,就是这个订单准备来锁库存了,把订单号和订单ID上传了,传过去订单号就能唯一识别了,就来保存一个这个信息,所以们现在呢,拿到我们这个订单的order task service点一个,那现在呢,要保存我就来直接save save创建一个,当我们现在呢叫where order task,我们现在是创建一个这个实体类啊。这个实体类的我们就叫task实体类们,这个订单库存工作单的这个任务这个实体类,这个实体类里边我们就放上一个叫set。
08:10
Order SN,那么这个订单号,那相当于为哪个订单号所得库存,这个订单号呢,从人家传过来的这个数据里边也都有点一个get订单号,好这就行了,那相当于先来保存了一个库存工作单的详情,接下来每个人只要一锁定了库存,只要一锁成功了,我们再来保存这个所成功的这个详情,我们就是order detail这个service,我们再来save一个,这个所成功的详情呢,我们就来new一个我们现在叫where,我们的order这个detail的这个实体类。来拗它的时候,那为了方便我们来给它添上无餐和全餐构造器,有一个no constructor no ug constructor,这是无餐构造器,再来加上一个全残构造器all constructor,我们来准备保存一个它,那么现在这个全残构造器我们来准备好以后呢?那现在要有几个参数,我们都先来传入闹闹no,我们来看一下这几个参数呢,都应该是什么类型的,来看我们现在呢这个参数。
09:11
还不够,我们来多传一些呢,好,首先第一个是ID,我们要保存这个库存工作单详情的这IID,这个ID呢是自动生成的,我们不用管,然后呢,接下来我们是要哪个SKU,那相当于是当前这个SKU,当然这个商品名字叫什么,如果我们想要获取的话,我们也能获取到,那就是当前我们正在便利的要锁的这个商品,我们这个商品点一个它的这个名字。这个名字我们没传,那我们就不要了,好相当于我们是当前这个商品,然后呢,我们要锁库存,要锁几件,那们这个数量呢,在这儿也有,那是在这个数量,然后呢工作单的ID,我们库存工作单呢,之前已经保存了这个实体类,只要一保存它这一块呢,就直接会有这个工作单的ID,好我来保存一下,点一个get这个ID,然后呢,还有我们在哪个仓库锁了,我们来看上一个方法,这个就是锁库存这个商品这个数量在这个仓库锁了,这个呢复制过来,我们呢是在这个仓库锁了,然后呢,锁定的状态目前呢是什么?好,我们现在状态呢,假设目前呢都是一一呢,就代表我们这个锁定成功了,好,我们来点一个改变表一呢就叫锁定,我们在库存里边锁定了,那上面呢,锁定成功了,那创建了这么一个实体类好走,那创建过来以后呢,把这个实体类我们先来保入到保存到数据库里边保存进。
10:40
来以后,那相当于每锁一个库存,那么在数据库里边都会保存当前工作单的这个详情。一个订单对应这么一个详情,和他每一个仓库锁了多少件们在这都会保存,保存完了以后呢,我们再来发送消息,那rabbit time告诉rabbit MQ,我呢锁了一些库存,所以我们接下来发消息发给谁呢?那现在想要触发你的自动解锁逻辑,我们呢就把库存锁定成功的消息,我们呢以这个路由件发给我们这个默认的交换机,好,我们CTRLC们让它发给这一块。
11:17
那么交换机的名字,大家可以把这些名字呢,都配成一个常量,这样比较好,好我们现在呢,发给这个交换机,然后发的消息内容是什么,然后用到路由件是什么好,那现在呢,用到路由件,我们来指定一下用到路由件。我们第一次,我们现在呢,用的路由件应该叫to locked,我们刚把库存锁定成了,然后呢,我们发的这个消息内容是什么,我们发的内容呢,就应该是这样,我们告诉他哪一个库存工作单,然后呢到底锁了多少个商品信息,好我们现在呢,专门来准备一个给MQ传输的这个to,好我们现在呢,把这个to我们可以写进库存系统,但是我们想想我们这个要传出去的这个数据,别的系统呢还要拿过来用,所以我们经常MQ发送的这些消息数据,大家伙呢可能都要用,我们可以抽取到common里边,好,Common里边呢,我们来专门在to里边,我们准备给MQ发的所有数据来写一个包,MQ好,我们现在呢,第一个题我们就叫sto。
12:29
To lockto。Locked,那库存呢,锁定成功的这个to啊,这个to,这个to里边呢,包含这些信息,首先是private,首先呢包含我们当前的库存工作单的ID,这是我们将库存工作单的ID,因为一个工作单我们想要锁库存,先创建为当前订单创建一个工作单,然后呢,我们照着这个工作单给他来进行库存的锁定,而且这一块呢,我们外建呢,关联的是工作单的ID,并没有关联订单号。
13:07
所以我们我们应该按照订单号先查出工作单,按照工作单再来看到这些哪个都锁了多少库存,那为了方便我们直接把这个库存工作单的这个ID,我们让他保存一下,那接下来我们再来保存,保存一个什么呢?应该是一个list类型的,List类型的什么,就是每一个仓库什么东西锁定了几件,相当于是这个完整的信息,所以我们接下来呢,就把这个完整的信息,我们在这儿呢,直接一保存。因为这个完整的信息呢,其实我们不用保存的这么完整,每个SKU等等等等,这些都是什么,我们要保存什么,们只保存一个这个ID就行了,因为按照ID呢,其实能查出这些信息。所以我们可以保存一个list类型的了,这个呢就是detail ID,那么这个详情的ID,这就是工作单单详情的所有ID,那这样的话呢,我们把他们都传出去,好,我们现在呢就准备来发一个消息,那么现在呢就来拗一个叫sto。
14:12
Look的这个to,好,这个to的这个数据我们来给它准备好,那么这个to呢,它里边的这个数据我们将要把它来发送出去,好把它发送出去,然后呢,我们来看我们发送的数据呢,是这样子的,我们来先来保存一个,点一个set ID,这个ID呢,就是我们的这个工作单的ID,工作单在这儿CTRLC,我来复制过来,工作单的ID在这一放,点一个get ID,然后呢,第二个叫lock。To点一个set,这有一个叫detail ID,关于这个detail ID,它呢就是我们所有锁了的库存的这些ID信息,那这个呢,我们可以把已经锁定了的库存的这些ID,我们可以来收集起来,当然这个呢,我觉得还是有点麻烦,那么最简单的,那现在呢,就是每锁一个库存,我们给他发一个DTID,就告诉他这个人呢,刚锁了,这个人刚锁了,现在我们看到我们在这儿呢,一旦if成功,相当我们这个人的库存锁成功了,那就把他的这个锁的这个库存的详情单,详情单就是这个a nt,把这个N的ID给他呢发出去,发给消息队列,这样呢,只要有一个SQ锁定成功,那么消息队列里边就有一个消息说这个人他锁定成功了,我们就能拿到这些消息。
15:37
如果想要发详细,那也可以来发详细,把整个实体类都发出去都没关系,那么现在呢,就只发两个ID,好们来发出去以后我们在这呢,好发出去,我们现在来做一个测试,只要我们锁成功了,我就发出去了,那现在问题就是锁失败怎么办?来分析一下我们这一块的逻辑,如果如果每一个商品都锁成功,都锁定成功,那么呢,它的所有信息就是当前商品到底在哪个仓库锁了几件,我们都保存数据库了,把数据库的这条记录ID给他发出去了,我们呢,相当于将当前商品,当前商品保存了,锁定了几件,锁定了几件。
16:22
那这个工作单详情记录,工作单这个记录,这就类似于日志一样,我们直接呢发送给了MQ,发送给MQ,这就是我们锁定成功视频啊,接下来我们如果锁定失败,我们来看一下这块呢,稍微得注意,如果我们这个锁定失败,锁定失败,但我们会发现啊,如果我们前些人都锁定成功消息发出去了,有一个人一锁定失败,一锁定失败以后呢,前面保存的这些工作单信息就回滚了,因为我们这个是一个事物,所以呢,前面保存的工作单信息就回滚了。
17:03
那你回滚以后呢,我们还把消息发出去了。但是这个没事儿,我们就算呢要解锁库存,因为我们发的是ID,你得拿ID去来查,我们当时整了多少库存,但我回滚了,那就没这个ID,你查不到记录就不用解锁了,所以呢,我们现在可以整一个这个,我们呢现在即使发送消息也没问题,发送出去的消息,发送出去的消息即使要解锁记录,要解锁记录。由于呢查不到ID,查不到这个指定ID去数据库,去数据库查不到ID,所以呢,你就不知道当时锁了多少个,你也不用解锁,所以就不用解锁,但是呢,我们说这种东西合不合理呢?我们说其实它是不合理的,来可以给大家看一下,如果我们现在是这个场景,一号商品它呢,锁了两件在一号仓库它锁成功了,然后呢,二号商品锁了一件在二号仓库锁成功了,结果呢,三号商品锁一件在一号仓库锁失败了,那这个一锁失败以后,我们发出去的消息确实带了他们的ID,比如呢,这条记录是一号记录,然后呢,这个是二号记录,然后呢这个是三号记录,但是呢,既然锁了,我们相当于就已经扣了,我们扣了以后呢,接下来我们要做的事情就是要。
18:30
解锁,但我们只给他发ID的话,只发ID行不行,只发ID只发ID,只发ID我们就会发现我们这一块呢,由于锁定失败,我们第三个记录锁定失败,前面两个人都回滚了,那一回滚,但是我们在这儿呢已经扣减了,在这儿扣减了,但是你的工作单却给回滚了,你相当于就不知道这个人到底当时锁了多少个了,因为你按照ID都查不出来了,所以我们说这块光发ID还不够,他应该发送我们这个完整消息,所以我们把这个库存工作单的整个完整消息我来复制一下,他呢把这一块要全部发出去,那么接下来呢,在这来准备一个,在to里边呢,我们来准备一个库存的详情的toTo Be,这个to,这个to的详细内容,那就是这些它的所有信息呢,我们都给它发出去,那接下来来到这一块,我们的这个detail。
19:30
啊,NT,我们的这个to,它的第二个就不应该是我们的DID,我们直接把这个库存的当时锁定详情直接给它传出去,出去啊d to这是D的详情,然后呢,接下来我们来到我们这儿,只要有一个锁定成功,除了给他发工作单ID外,还把当前他锁定的这个详细信息点一个set set他的细信息,你把这个当时他是这么来锁的,给它放进去,但这两个呢,由于不是一个对象,但是他们属性都一样,所以我们使用being u直接对拷一下,点一个copy properties,把原数据拷贝到目标对象,原数据呢,就是它把它呢拷贝到目标对象。
20:17
目标对象呢,是我们应该new一个,这是一个detail叫to detail的这个to,好我们把它传过去以后呢,好我们来返回结果,我们发现这个没返回结果,所以我们这个目标对象必须自个new,自个new,然后呢把数据呢给你封装过去,CTRLC封装过去以后呢,你把这个传出去,所以这样的话只发ID不行,就是防止我们在前面的数据回滚,防止回滚以后,回滚以后找不到数据,好现在呢,我们核心的这一块,我们先编写好,我们来测试一下。我们现在来启动我们的这个订单服务,呃,不是,是我们的库存服务,我们就来进行下订单,但是我们现在默认下订单呢是成功的,我们现在默认的逻辑,我们来到这个订单的service order service employment,我们现在呢,默认下订单是成功的,而且所库存也是成功的,但只是订单出了异常,那现在没拿分布式事务库,然后我们来看一下效果,只要锁库存成功了,我们这一块呢,就会有库存工作单,那我们要解锁就按照这个工作单的详情来进行解锁,好,我们现在先来测试一下。
21:31
我让他们都来启动起来,好,我这个库存服务呢,现在就启动起来了,启动起来以后,我们接下来在这儿,我们先来看我们的这个队列,队列里边呢,目前没消息,我们来给它大家创建上一个订单to出来刷新。肯定得得要求先登录好,我们现在来登录一下,那由于服务重启,我们第一次登录呢,老是超时失败,我们就重新多试几次,好现在我们去来结算订单,我们来到我们这个订单,我们一号二号这两个商品,由于我们现在库存是充足的,现在也只锁了三个,然后呢,我们去来下订单,去结算,好我们来到结算页,这两个东西呢是有库存的,然后我们去下订单,但订单会下失败,我们订单呢会回滚,我们来看我们的订单消息,订单呢现在默认应该只有一个,好,那现在再去下订单,我们来看我们的库存工作单,库存工作单呢,我们现在没有任何内容,然后我们来去下订单,在这儿来点一个提交订单,订单呢是下失败,我们来到我们的订单这一块,保证订单没内容好,订单呢没内容确定,但是我们这个库存呢,一定是已经扣了来到库存里边。
22:38
我们来刷新它应该增到四,这个呢,没有增到四,我们来看消息队列里边有没有消息,那也没有消息,说明我们整个服务代码都没运行成功,我们重新来下一个订单,好,我们现在重新来测试一个下订单,那之前的这个可能由于其他业务已经失败了,我点一个下订单,好订单呢现在下失败,来到我们这个库存里边,我们这个库存呢,居然没有扣,那是不是我们这个已经有了订单里边的分事,我们来看一下咱们这个order service order service employment里边,我们要保证不使用分布式事物,好,我们现在呢,只加了一个普通事物transitional。
23:16
我们没有加分布式事务啊,订单在下边,我们来看,下边呢也会失败,那失败以后呢,应该订单回滚,库存不滚,我们来重启一下订单服务,来测试一下,走好,我来重新清空,我们来测试一下下订单先来刷新。现在呢,我们先让他点一个提交订单,好订单呢,现在错误们应该库存呢不回滚,但是我们发现呢,库存还在这回滚了,而且订单呢也都回滚了,那我们直接将西塔的整个分布式事务功能全禁掉,好我们来到这个订单服务里边,那现在不使用西塔来控分布式事务,那在这儿来测一下,在订单服务里边,我们直接在这排除一下分布式事务的自动配置,它呢叫global transition now。
24:01
这个我们的全局事务的自动配置好,把这个呢一排除,我们让订单呢,没有这个分布式事务功能好,现在订单呢重启起来,把它呢clear尔掉,先来重新来下一个订单。来测试一下,一定要保证我们的这个库存是不回滚的,因为我们库存会锁定成功,只是订单呢下失败了,好,我们点一个提交订单,好,现在订单在这一块下失败,我们来看库存,我们发现库存这一块呢,它并没有库除,那说明我们哪一块可能执行出问题了,来看一下订单,订单服务器里边呢,没有报错,来看一下我们的库存,库存在上边,诶,确实报错,他说这个数据转换没有序列化器,找不到我们这个sto detail to的这个序列化,说他没有发现属性,说在我们这个detail to detail to,我们来找一下,就是在这个里边呢,没有发现属性,好我们发现这个private属性有,但是我们没写get set方法,好,我们来加一个an data来重新来启动我们的库存服务以及订单服务,好我们现在重新来启动,那现在重新来下单,那现在我们的业务逻辑就就应该是我们这个下单呢会失败,但是库存呢,我们已经扣减了,我们没有使用C塔。
25:15
来做分布式事务控制,我们给MQ来发送了一个消息,那最终呢,自己可以取出消息来,把这个库存呢再加回去,好我们现在来看一下我们这个效果,那点等待我们的订单和库存服务启动成功,好,我们现在这一块呢,服务都启动成功,把这两个控制台清空一下来重新下单,那现在点一个提交订单。好,我们来刷新一下,好,现在这一块呢,订单也提交完成,但是我们来看一下库存,库存呢扣减了来到我们这个订单,订单这一块呢没有下单,确实,但是库存呢已经扣钱了,怎么给他扣回来呢?因为我们当时扣库存的时候,那写了一个库存工作单,就是这个订单号,诶工作单呢是六号,然后呢,他当时一号商品他呢在这个仓库,然后呢扣了几件的库存,然后我们这一块呢状态都有,那而且他关联的是六号这个库存工作单没问题,我们记录了,所以而且看我们这个消息队列里边,因为我们两个商品呢都库成功了,那这个延迟队列里边,我们发现诶有两个我们这个消息,那接下来我们想要把库存减回去,再加回去,那怎么做所我们只要有人监听这个消息队列就行了,同样来到我们的这个库存服务,好来到我们这个库存服务,库存服务,那库存服务呢,我们在锁库存的时候,我们将消息发出去了,那接下来同样的我们就应该有一。
26:36
个解锁服务,那我们专门在我们的这个service里边,我们就在这个SQ service里边来添上一个我们解锁库存的功能,好方法呢,就是一个word的方法,我们就叫release释放我们这个lock stock释放我们这个锁定了的库存,当然它监听的是我们消息队列里边的这些消息,那们把这个呢,也不用写到接口里边了,来随便打开它的这个实现类,我们在实现类里边我们还要监听消息们直接给类头写一个rabbit listener,我要监听哪个队列里边的消息,因为我们库存的这些消息首先呢会发到这个延迟队列,但最终呢,延迟队列不是被人监听的,按照我们的工作流程,我们要监听的是这个库存解锁的这个队列。
27:26
好,我们现在呢就来监听这个队列,队列里边只要有消息你就来处理,然后呢,专门写上两个处理消息的方法,我先来写一个,就叫handler来处理我们这个to lock了,Release处理我们这个库存锁定的这个释放请求,然后呢,由于我们这个MQ会给我们传一个to lock的to,所以我们来直接来接收它就行了啊,这是我们的to数据,然后呢,我们的message消息,我们想要了也可以拿过来他完整的message信息,然后我们就在控制台输出,好,我们收到解锁库存的咱们这个消息,然后接下来我们就来给他解锁库存,那这个to里边我们能看到这些数据,首先第一个ID是我们库存工作单的ID,好,这个是库存库存工作单的ID。
28:21
按照这个ID我们完全可以找到,我们来看,按照我们指定的这个ID6,我们完全可以能找到,当时这个订单都锁了多少库存,这呢会有内容,所以我们拿到这个库存工作单的ID。然后呢,我们就可以解锁库存,当然解锁库存呢,也可以直接拿到to里边,那都告诉你了,这个D票每一个详细信息,这个里边谁就是我们这呢,有SQ的ID,就是这个商品,然后呢,哪个仓库锁了几件,你重新呢再加回来就行了。但我们在这块呢,要来解锁它呢,不是我们直接来解锁的,那先来加一个rabbitta handler来考虑一下我们现在的这个场景,那现在这个场景呢,是我们这个库存自动解锁,怎么自动解锁,那现在先是来做第二个场景,第二个场景就是我们说的。
29:14
我们来找一下我们的库存锁定服务,这我们库存的这个ctrler它在这儿锁定,我们说呢,有两种情况是下单成功,然后呢,我们这个订单被用户或者系统取消了,我们要解锁库存,那我们现在先来讨论第二个情况,那这个下单成功,我们在这呢,这种来解锁库存,好那先来讨论这种情况,那现在呢是下单成功,那么这个库存呢,锁定成功了,锁定成功呢,但是之前的业务逻辑导致订单回滚了,所以我们这个库存工作单还在,那库存工作单在的情况下,我们想要解锁呢,就可以直接来解锁,但是我们再来考虑另外一种逻辑,如果我们这个订单失败,如果我们说这个订单失败本身就是由于锁库存,锁库存失败导致的,就是呢,有一个商品没锁住,那有一个商品没锁住的话,我们首先库存里边呢,它就会整体回滚,一整体回滚,我们这个库存工作单数据都没有,所以我们现在要解锁库存一定得判断我们。
30:15
在这拿过来,我们拿到库存工作单这个详情的这个ID,我们呢先去数据库查一下,我们最好呢去数据库查一下,我们先来第一步查询数据库。关于这个订单的所库存消息,关于这个订单。的锁定库存信息,如果数据库有,现在呢,我们这个有和没有,那没有呢,是这种情况,是我们这个,如果这个工作单都没有,那是我们库存本身就锁定失败了,库存咱们这个锁定失败啊,然后呢,整个库存也回滚了,库存回滚了我们导致的这个没有。
31:02
这种情况下呢,我们无需解锁,这种情况无需解锁,虽然你在这详情里边给我带了这个商品,然后呢,他当时锁了多少件,你都带了,但是呢,我们无需解锁,但如果是我们有的这种情况,我们呢就需要解锁,所我们来判断一下,我们先来去找这个detail信息,我们来到这个order task detail service,我们直接按照ID来拿就行了,直接点一个GET8ID,我们按照我们这个工作单详情里边封装着的这个ID,我们直接呢去他的工作单详情里边来查,我们只要来查到,好,那现在呢在这来查,只要我们查到if,它不等于空,不等于空,我们就给它进行解锁,相当于呢,我们现在是没有有的情况,有的情况呢,我们就来进行解锁,如果没有,那就无需解锁,你虽然给我带了这个消息。
32:02
说哪个锁了多少件,那现在呢是无需解锁。无需解锁,那这一块的解锁逻辑呢,就是相当于把这个商品的数据再给他加回去,那下一节课我们就来编写完整的解锁逻辑。
我来说两句