Fan*_*Lin 5 database transactions paypal atomic
我正在写一个网站,允许用户提交信用卡信息并订阅我的Web服务。我正在处理数据库记录和PayPal API,我注意到会出现一些潜在的问题。也就是说,如果以下数据库操作失败,我将无法回滚PayPal API调用。例如,假设我们创建了一个定期付款配置文件,并在RMDB事务中将记录写到这样的数据库中
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Insert a record to table 'subscription'
Transaction end
Run Code Online (Sandbox Code Playgroud)
如果没有问题,这可以正常工作,但是如果我们将预订记录插入数据库失败,该怎么办?
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Insert a record to table 'subscription' failed
Transaction rolled back
Run Code Online (Sandbox Code Playgroud)
当然,我们可以回滚数据库的事务,但是我们不能回滚PayPal API调用。然后,我们在PayPal有一个孤儿定期付款资料。我有一个主意,我可以先创建订阅记录,然后再更新。
Transaction begin
Insert a record to table 'subscription'
Transaction end
Transaction begin
CreateRecurringPaymentsProfile (PayPal)
Update subscription record
Transaction end
Run Code Online (Sandbox Code Playgroud)
这样,如果数据库操作失败,则至少我们具有订阅记录。这可能是一个可能的解决方案,但是我想知道有什么好的做法不能像这样回滚数据库操作?特别是当我们处理金钱时。
谢谢。
我建议您按照您的考虑分两步进行。交易首先以“已初始化”或类似状态创建。然后,在 PayPal 付款成功返回后,您将状态更改为“已付款”。
即使 PayPal 交易失败,保存交易也是有好处的,这样您就可以知道有多少笔失败/放弃的付款。