如果支付宝付款成功,而数据库插入记录失败了,怎么用事务进行回滚,
这个问题其实本质上是一个分布式事务的问题,更通用一些的问题是的:
如何保证两个不同系统间数据的一致性?
目前个人感觉比较好的方法是采用消息的方式,通过可靠的消息中间件,将一个大的事务操作,拆分为多个小的本地事务,通过最终一致的方式实现ACID
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
以异步通知的支付宝实时到账的SDK支付接口为例,做的时间有点久了,和支付宝交互的过程可能说的不是非常正确,不过不影响处理逻辑:
支付宝向你的notify_url发起一个post请求,其中包括了各种订单信息和当前的付款状态作为参数
收到请求后你应该要对此请求进行校验(验签)
如果一切正常,你开始调用PDO的
beginTransaction
开启事务写入对你的数据库进行正常的操作
操作的过程中如果有任何异常,自行捕获,调用PDO的
rollback
进行回滚,然后返回支付宝非success字符串(或者空)如果一切正常,调用PDO的
commit
提交事务,然后返回支付宝success的结果注意,如果你这里没有正确结束,永远不要向支付宝的异步通知请求返回"success"成功的结果,对于异常的情况支付宝会重复调用7次通知