最近项目里碰到关于水电煤缴费 出现了账户余额剩余100元,但同一时间可以成功支付4笔100元订单的问题.出现这种问题的原因主要在于短时间内前端按钮操作抖动多次请求的情况.同时后端在判断账户余额然后下单的过程中出现了多线程并发的问题。解决这种问题的方法一般是从解决订单重复提交+防止高并发情况下账户余额为负数的情况解决方案。(类似于商品库存超卖的解决方案)
一般完整的订单支付流程是这样的
1.后端生成订单编号,前端将订单编号填充的下单页面中
2.下单页面 确认订单编号对应的下单相关信息,提交给后端
3.后端首先判断该笔订单编号是否提交,未提交判断账户余额信息是否够用,如果够用下单,不够用提示前端。如果已提交 提示订单重复提交.
关键在于同一时间下单4笔100元,判断账户余额到下单修改账户余额存在间隔,只要在此时间段过来的请求都可能发生下单多笔成功但实际账户余额不足以支付的问题.
防止订单重复提交的技术解决方案
防止订单重复提交 参考文章链接
关于防止订单重复提交的技术解决方案这里面做了很好的介绍,包含4中解决方案,但前面2种方案因为查询订单到插入订单存在间隔,无论是采用mysql还是缓存的方式都会存在问题。所以这里只把采用唯一索引表+redis计数器的方案使用说明下。因为无论是查询订单是否重复提交的判断是基于数据库或者缓存是否存在该笔订单编号,如果存在不存在说明没有重复,插入数据,存在说明已重复无法提交.所以在查询数据到修改数据库中间会存在间隔,会出现问题。所以需要利用原子性.如果想更加保险的话,建议通过token令牌的方式,后台创建订单好的同时创建缓存中,新增的时候判断订单是否存在,存在才可以提交订单,逻辑判断完毕删除该订单.后面的相同的订单因为缓存中不存在该订单号,所以会有问题.
- 创建唯一索引表:创建根据订单编号来插入的唯一索引表。不存在插入成功说明未重复,存在说明重复。无法插入 报错.

本文探讨了支付系统中防止订单重复提交及并发控制的策略,特别是在高并发场景下,如何确保账户余额准确无误,避免负数余额问题。通过分析订单支付流程,提出采用唯一索引表与Redis计数器的解决方案,有效防止订单重复提交,保障交易安全。
最低0.47元/天 解锁文章
2273

被折叠的 条评论
为什么被折叠?



