Rest 在单个事务中执行数据库操作和API调用可以吗?

Rest 在单个事务中执行数据库操作和API调用可以吗?,rest,api,transactions,microservices,distributed-system,Rest,Api,Transactions,Microservices,Distributed System,让我们以一个简单的购买操作为例,用户可以从钱包或信用卡付款,如果金额超过他钱包中的金额,则剩余金额将记入他的信用卡。因此,在这种情况下,有两种不同的交易,一种是借记钱包,另一种是向信用卡收费。让我们假设钱包是一个DB操作,而信用卡是一个对第三方的呼叫,在一个DB事务中执行这两个操作可以吗?这样,如果一个操作失败,整个操作将回滚,或者我应该并行执行,因为大多数现代应用程序现在都使用并行操作。如果我并行执行这两个操作,那么如何确保整个操作的原子性 我们如何在微服务体系结构或分布式应用程序中实现此类功

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

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


提前谢谢。

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

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


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

非常感谢您的帮助,非常感谢。你能告诉我一些实际代码的例子或者解释类似情况的东西吗?这对我甚至会有帮助。