分享
在电子商务系统中涉及到的支付的问题,由于支付操作不能在事务中,怎么保证原子性?
在电子商务系统中涉及到的支付的问题,由于支付操作不能在事务中,怎么保证原子性?最近做了一个项目涉及到了支付和库存。在支付成功后,库存减少。但是由于支付是调用第三方(微信)服务,并不受事务控制。假如我在输入密码的过程中,库存的最后一件已经被买走了。那我支付成功后反而无货了。如果我在发起支付的时候就锁住一定数量的库存,但是在我还没输入完密码时手机故障。那这些库存就永远被锁住而不能销售了。大家在做电子商务的时候一定也遇到这样的问题。怎么解决呢?大家除了了定时释放被锁定库存的策略外,没有别的做法么?(其实定时释放库存这种方法有个弊端,就是我长时间停留在支付窗口,这时候后台却释放了库存,而发生不希望看到哦的异常,解决方法就是释放库存的同时调用支付服务的关单接口。)
回复 ( 9 )
只能是这个办法,在本地数据库中通过锁库实现事务的强一致,通过超时机制(可以给用户倒计时时钟提示)来完成支付事务。
这里的问题看起个技术问题,其实是个业务设计的问题,一些业务变通一下,技术的难度就会大大降低。
目前没有强一致性的解决方案,都是把下单和支付分开来做,因为用户支付时间是不可控的,只能给足一定的时间,没有支付再释放库存
用户下单以后,商品库存就减少1,用户支付以后再发货。如果用户不支付,30分钟后释放库存,此订单关闭。这样就不存在事务不事务的问题了。
第三方支付服务应该都支持订单过期时间的
锁定库存,限时支付,超时释放
这和12306的卖票场景基本一样,当订单生成的时候要锁定一张票,超时未支付再把这张票释放出来,这是最make sense的解决方案了。我记得支付宝是支持商户自定义交易有限时间的,1分钟到15天都可以,微信不知道是否也支持,如果支持就不用商户自己处理订单失效的问题了。
轮询
谢邀
把逻辑理清了很简单,分两步:
1. 当用户下单时(或加入购物车),会事先锁定库存。锁库存的时间由产品经理来制定。支付完成减掉库存。
2. 写个定时跑的程序,如果限定时间内没有完成支付,就释放掉该库存。再支付时则需要重新下单。
分情况:1. 无限库存的(就是 可以 随时补货),锁定库存的时间长点。 2. 不能及时补货的。限制付款时间,锁定库存。
总结:锁定库存的时间长短不同。
定时程序check订单是否超时,超时释放库存