5

我正在写一个网站,让用户提交信用卡信息并订阅我的网络服务。我正在处理数据库记录和 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

这样,如果数据库操作失败,至少我们还有订阅记录。这可能是一个可能的解决方案,但我想知道处理数据库操作的良好做法不能像这样回滚?尤其是在我们处理金钱的时候。

谢谢。

4

1 回答 1

3

我建议您像您考虑的那样分两步执行此操作。事务首先创建,状态为“已初始化”或类似。然后在 PayPal 付款成功返回后,您将状态更改为“已付款”。

即使 PayPal 交易失败,保存交易也有好处,因此您会知道您有多少失败/放弃的付款。

于 2012-09-03T17:29:18.740 回答