【问题标题】:Is it okay to do database operations and API call in a single transaction?可以在单个事务中进行数据库操作和 API 调用吗?
【发布时间】:2018-12-24 00:57:46
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: rest api transactions microservices distributed-system


    【解决方案1】:

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

    如您所愿地执行此操作的唯一方法是在 API 上进行提交和回滚操作,然后使用 2PC/3PC/Consensus 驱动跨系统事务。

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

    【讨论】:

    • 感谢您的帮助,非常感谢。您能否指导我看一些带有实际代码的示例或解释类似案例的内容?这对我来说甚至会有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多