84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
如果支付宝付款成功,而数据库插入记录失败了,怎么用事务进行回滚,
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
以异步通知的支付宝实时到账的SDK支付接口为例,做的时间有点久了,和支付宝交互的过程可能说的不是非常正确,不过不影响处理逻辑:
支付宝向你的notify_url发起一个post请求,其中包括了各种订单信息和当前的付款状态作为参数
收到请求后你应该要对此请求进行校验(验签)
如果一切正常,你开始调用PDO的beginTransaction开启事务写入
beginTransaction
对你的数据库进行正常的操作
操作的过程中如果有任何异常,自行捕获,调用PDO的rollback进行回滚,然后返回支付宝非success字符串(或者空)
rollback
如果一切正常,调用PDO的commit提交事务,然后返回支付宝success的结果
commit
注意,如果你这里没有正确结束,永远不要向支付宝的异步通知请求返回"success"成功的结果,对于异常的情况支付宝会重复调用7次通知
插入失败就告诉支付宝失败了,支付宝会一直发回调过来,你总有一次插入成功的。
这个问题其实本质上是一个分布式事务的问题,更通用一些的问题是的:如何保证两个不同系统间数据的一致性?
目前个人感觉比较好的方法是采用消息的方式,通过可靠的消息中间件,将一个大的事务操作,拆分为多个小的本地事务,通过最终一致的方式实现ACID
无法回滚,一个是支付宝接口,一个是本地数据库操作
以异步通知的支付宝实时到账的SDK支付接口为例,做的时间有点久了,和支付宝交互的过程可能说的不是非常正确,不过不影响处理逻辑:
支付宝向你的notify_url发起一个post请求,其中包括了各种订单信息和当前的付款状态作为参数
收到请求后你应该要对此请求进行校验(验签)
如果一切正常,你开始调用PDO的
beginTransaction
开启事务写入对你的数据库进行正常的操作
操作的过程中如果有任何异常,自行捕获,调用PDO的
rollback
进行回滚,然后返回支付宝非success字符串(或者空)如果一切正常,调用PDO的
commit
提交事务,然后返回支付宝success的结果注意,如果你这里没有正确结束,永远不要向支付宝的异步通知请求返回"success"成功的结果,对于异常的情况支付宝会重复调用7次通知
插入失败就告诉支付宝失败了,支付宝会一直发回调过来,你总有一次插入成功的。
这个问题其实本质上是一个分布式事务的问题,更通用一些的问题是的:
如何保证两个不同系统间数据的一致性?
目前个人感觉比较好的方法是采用消息的方式,通过可靠的消息中间件,将一个大的事务操作,拆分为多个小的本地事务,通过最终一致的方式实现ACID
无法回滚,一个是支付宝接口,一个是本地数据库操作