反向思维,若没有额度预占,系统会有什么问题?
没有额度预占
我们知道,额度预占
、额度扣减
是搭配调用的。这个流程,是在授信完支用期间的,流程如下图:
额度扣减: 核心建立借据成功(放款成功),就要进行额度扣减。
若额度不足,流程不会提交到风控,也不会提交到核心,咋一看,看起来没问题。
但是,多线程并发情况下就会有问题。
背景假设: 一个用户A剩余额度只有1000¥了,从不同的渠道提交了两笔借款单,两笔单共用一个额度,总额度只有1000¥。
- 订单A,借款600
- 订单B,借款800
1、订单A,被捞起,额度足够,提交到风控。由于风控还未出结果,尚未提交到核心。
2、此时订单B,被捞起,判断额度足够,也被提交到了风控,走后续流程。
3、订单A,风控审核通过后,提交到核心,额度扣减。流程结束。
4、此时订单B,风控审核通过,提交到核心,建立借据,放款成功。做额度扣减时,发现额度不足,那核心就需要对这笔借据冲正, 还需要把这笔放款退回来。
PS: 当然第4部有很多手段可以避免,比如在提交到核心建借据之前,再次判断余额是否足够。但同样存在多线程问题,或者会把逻辑变得很复杂。
有额度预占
继续用上面的背景做假设。
1、订单A,被捞起,预占额度600
,提交到风控。由于风控还未出结果,尚未提交到核心。
2、此时订单B,被捞起,预占额度800
,发现余额不足了,会预占失败
,直接将订单状态置为失败, 流程结束。
整个流程简单明了。
额度预占多线程问题
当然,额度预占这里也会存在多线程并发问题,需要警惕。
预占额度流程如下:
背景假设: 同一个用户的两笔额度多线程请求预占,使用的是同一个额度,假设可用额度为:1000¥
1、线程A,请求查询额度600,进入其他处理
流程,这是个耗时操作。
2、线程B,请求查询额度700进入其他处理
流程,这是个耗时操作。
3、线程A其他处理
流程走完,算出可用余额为400,更新数据库可用余额为400,流程结束。
4、线程B其他处理
流程走完,算出可用余额为300,更新数据库可用余额为300,流程结束。
线程B本来应该预占失败的,结果还成功了,并且还有可用余额。
那么,如何解决这个问题?🤔请关注篇文章