我正在撰写一个网站,让用户提交信用卡信息并订阅我的网络服务。我正在处理数据库记录和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
这样,如果数据库操作失败,至少我们有订阅记录。这可能是一个可能的解决方案,但我想知道处理数据库操作的哪些好方法不能像这样回滚?特别是当我们处理钱财时。
感谢。
答案 0 :(得分:2)
我建议您按照您考虑的两个步骤执行此操作。首先创建事务,状态为“已初始化”或类似。然后,在PayPal付款成功返回后,您将状态更改为“付费”。
即使PayPal交易失败,也可以保存交易,这样您就可以知道有多少失败/放弃的付款。