让我们以一个简单的购买操作为例,用户可以从自己的钱包或信用卡中付款,或者如果金额超过了他的钱包中的金额,那么剩余的金额将记入他的信用卡中。因此,在这种情况下,存在两种不同的交易,一种是借钱款,然后又用信用卡扣款。并假设钱包是一种数据库操作,而信用卡是对第三方的调用,是否可以在单个数据库事务中同时执行这两项操作,因此,如果一个操作失败,则整个操作会回滚,或者我应该并行执行现在,大多数现代应用都利用并行操作。如果我同时执行两个操作,那么如何确保整个操作的原子性?
我们如何在微服务架构或分布式应用程序中实现这种功能?
谢谢。
答案 0 :(得分:0)
不,它不会像您希望的那样工作。假设您执行数据库写入,API调用,数据库提交,那么如果API成功并且数据库中止,会发生什么?请注意,这与在API调用之后整个数据库事务完全相同。
要实现此目的的唯一方法是对API进行提交和回滚操作,然后使用2PC / 3PC / Consensus驱动跨系统事务。
或者您可以简化事务并将其转换为工作流/ fsm:每个更新的系统的数据库行中都有一个状态(对于COMPLETE,该状态为+1)。驱动系统更新每个外部系统后,它将fsm移至下一个状态,然后将其更新为系统状态。如果远程调用失败,驱动程序将重试调用系统,直到成功