我正在写一个网站,让用户提交信用卡信息并订阅我的网络服务.我正在处理数据库记录和PayPal API,我注意到会有一些潜在的问题.也就是说,如果以下数据库操作失败,我无法回滚PayPal API调用.例如,假设我们创建一个定期付款配置文件,并在RMDB事务中将记录写入数据库
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Insert a record to table 'subscription'
Transaction end
如果没有出错,这可以正常工作,但是如果我们将订阅记录插入数据库会失败怎么办?
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Insert a record to table 'subscription' failed
Transaction rolled back
当然我们可以回滚数据库的事务,但是我们无法回滚PayPal API调用.然后我们在PayPal上有一个孤儿定期付款资料.我有一个想法,我可以先创建订阅记录,然后再更新.
Transaction begin
Insert a record to table 'subscription'
Transaction end
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Update subscription record
Transaction end
这样,如果数据库操作失败,至少我们有订阅记录.这可能是一个可能的解决方案,但我想知道处理数据库操作的哪些好方法不能像这样回滚?特别是在我们处理钱的时候.
谢谢.
最佳答案 我建议你像你考虑的那样分两步完成.首先创建事务,状态为“已初始化”或类似.然后,在PayPal付款成功返回后,您将状态更改为“已付款”.
即使PayPal交易失败,也可以保存交易,因此您可以知道您有多少失败/已放弃的付款.