在一个事务中做数据库操作和API调用可以吗?

Is it okay to do database operations and API call in a single transaction?

让我们以一个简单的购买操作为例,用户可以从他的钱包或信用卡中支付,或者如果金额超过他钱包中的金额,则剩余金额将由他支付信用卡。因此,在这种情况下,有两种不同的交易,一种是从钱包中扣款,然后是从信用卡中扣款。假设钱包是一个数据库操作,而信用卡是对第三方的调用,是否可以在单个数据库事务中执行这两个操作,这样如果一个失败,整个操作回滚,或者我应该并行执行大多数现代应用程序现在都使用并行操作。如果我并行执行这两个操作,那么如何确保整个操作的原子性?

我们如何在微服务架构或分布式应用程序中实现此类功能?

提前致谢。

不,它不会像您希望的那样工作。假设您执行 db write、API call、db commit 那么如果 API 成功然后 db 中止会发生什么?请注意,这与整个数据库事务在 API 调用之后完全相同。

想要做到这一点的唯一方法是在 API 上进行提交和回滚操作,然后使用 2PC/3PC/Consensus 驱动跨系统事务。

或者您可以简化事务并将其转换为 workflow/fsm:每个正在更新的系统在数据库行中都有一个状态(+1 表示完成)。在驱动系统更新每个外部系统后,它将 fsm 移动到下一个状态,即下一个将更新的系统的状态。如果远程调用失败,驱动会重试调用系统,直到成功