额度系统,为什么需要有【预占额度】这个操作?

反向思维,若没有额度预占,系统会有什么问题?

没有额度预占

我们知道,额度预占额度扣减是搭配调用的。这个流程,是在授信完支用期间的,流程如下图:

额度扣减: 核心建立借据成功(放款成功),就要进行额度扣减。

若额度不足,流程不会提交到风控,也不会提交到核心,咋一看,看起来没问题。

但是,多线程并发情况下就会有问题。

背景假设: 一个用户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本来应该预占失败的,结果还成功了,并且还有可用余额。

那么,如何解决这个问题?🤔请关注篇文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值