首页 > 解决方案 > 存储过程和 REST API 作为事务调用

问题描述

Imagen 您在从 PHP 调用的数据库中有一个存储过程。该过程像事务一样工作,并将数据选择/插入到数据库中。如果成功则提交,如果失败则回滚。

现在想象一下,您需要通过 REST 在外部系统中存储相同的数据 - 在事务中。

因此,如果您首先运行存储过程并且它提交,那么如果 API 调用失败,您将无法回滚数据库。如果您首先运行 API 调用并且它成功了,那么如果存储过程失败,您将无法回滚 API 调用。

我需要在 PHP 的一个事务中更新本地数据库 (SP) 和两个不同的 API 端点。

任何人都可以就如何管理这笔交易提供建议吗?

谢谢!

标签: phpapitransactionsdistributed-transactions2phase-commit

解决方案


尝试将您的服务设计得尽可能彼此分离。如果您的外部服务必须在事务中更新,这是一个明显的耦合迹象。对于您的特定情况,外部服务是否需要立即更新,还是我们可以依赖最终的一致性?

我建议尝试将对外部服务的调用推送到队列。就您的本地服务而言,应该执行事务,然后应该将两个服务分派到队列中以更新您的外部服务。

现在,队列的魔力在于您通常可以监视它们,并在出现错误时重播失败的那些。在正常情况下,队列中的作业将毫无问题地运行。当出现错误时,开发人员会进入,修补它,然后重播作业。最终,外部服务赶上了本地服务。


推荐阅读