温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
前面呢,我们对重复的通知进行了处理,那么我们看一下之前我们在微信配service m PL当中啊,我们曾经也处理过重复的通知,我们来看一下之前我们的。Process order啊,这个业务方法,那在这个业务方法当中呢,除了处理这个重复通知,我们其实还在处理通知的外面呢,加了一把锁,那当时呢。我们讲的是有可能这个微信支付的这个通知呢,有可能会并发过来,因为微信支付那边呢,它是有一个服务器集群的,它不单单只有一台服务器来给我们发送回调通知,那么有可能呢,是同时有两台甚至更多台的服务器呢,给我们发送这个支付通知,那么当有多个支付通知同时到达的时候呢。我们会发现这个位置如果有两个通知同时到达,然后同时执行了这样的一个结果判断,那么接下来呢,又有两个通知在同时执行完结果判断之后,又去修改了订单状态,我们会发现这种情况下记录的支付日志呢,依然会重复的记录啊,因为它是在更新订单状态之前,两个通知都进行了判断,那么既然订单状态没有更新,那么两个通知对这个支付状态的判断呢,结果肯定是一样的,就是挪配,那么如果是挪配的话,那么两个通知呢,会同时到达这个位置,那么也会同时进入这个位置,所以这个呢,其实就是什么呀。
01:35
并发啊,函数重入造成的这个数据混乱,那么我们要避免这个并发的话呢,我们就得在外面加一把锁,当其中一个通知进入到这个锁所控制的范围之内的时候,那么另一个通知呢,它就没有办法进来了,那这个里面当时我们使用的呢,是可重入锁哈,就是这个lock,我们也可以在支付宝的这个业务当中呢,也添加这样的一把锁,避免我们支付宝当中也可能出现的这种通知并发的问题,所以呢,在这个地方我们加上这把原迟我们加入到我们的支付宝的这个。
02:13
阿里配service这个业务当中。好,然后接下来呢,我们利用这把锁来对我们的相关的代码。进行一个加锁哈,然后还要加上一个T啊。在这面。我们呢,也把这把锁加到。加到我们的。Process order的处理,重复通知的外面好,然后接下来呢,在处理完这个通知之后。我们看一下后面它是我们做了释放锁的这么一个操作。
03:04
然后后面这块呢,我们A1句结束掉啊,所以呢,这个就是我们在对应用数据进行状态检查和处理之前,要采用数据锁进行并发控制。以避免函数重入造成的数据混乱。那么。我们这个地方呢,当有一个通知进入到这个代码当中来的时候,它可以通过log.try log去尝试获取锁,如果成功获取,则立即返回处,如果返回处我们就会执行下面的具体的一个处理流程,比如说更新订单状态,比如说记录支付日志,那么如果获取锁失败了的话,那么它就会立即返回false,那么如果立即返回false的话呢,那整个这个通知呢就会被忽略,所以呢,我们就避免了这个通知并发的这样的一个问题。那么用这个锁呢,之前在微信支付开发的过程当中,我们也提到过,这个锁呢,必须是要被主动释放的,所以呢,在我们整个代码的结束这个位置,我们在finally代码块当中,我们去释放这把锁。
04:15
所以这块呢,就是我们在通知的过程当中,对我们的业务数据进行加锁处理,防止并发产生的数据混乱。
我来说两句