作者:城市学院艺术英语 | 来源:互联网 | 2024-11-21 10:00
在开发过程中遇到了一个棘手的问题:当用户通过微信支付成功后,系统会接收到多次回调通知,尤其是在使用ngrok进行内网穿透测试时,这种现象尤为明显。尽管在调试工具中仅能捕获到一次请求,但实际运行中,其他请求也会随之完成处理流程。
这一问题的关键在于,即使后台已经实现了幂等性处理(即相同的请求只会产生一次效果),但由于并发控制不当,导致多个线程几乎同时尝试更新同一订单的状态,从而造成重复支付的情况。例如,当第一个线程正在将订单状态从“未支付”改为“已支付”时,第二个线程可能还未意识到这一变化,继续按照“未支付”的状态执行支付逻辑,这就会导致支付操作被重复执行多次。
经过长时间的排查与尝试,最终发现了一个有效的解决方案:在Controller层的方法上添加锁机制。具体做法是在处理支付回调的方法上使用同步锁或分布式锁,确保在同一时间内只有一个线程能够执行该方法,从而避免了并发问题导致的数据不一致和重复支付的现象。