首页 > 解决方案 > 包装在数据库事务中的业务逻辑

问题描述

在我的应用程序中,我有一个定义路由的 api 层、执行业务逻辑的服务层和一个查询数据库的存储库层。服务将调用存储库层来检索数据,执行各种业务逻辑,然后将响应返回给 api 层。

现在,我有一些需要在数据库事务中完成的业务逻辑。例如,假设我的应用程序允许您购买给定活动的门票:

  1. 服务层调用存储库以通过减少可用票证的数量在数据库中自动保留票证。

  2. 然后服务层发出一个 api 请求来处理票的支付。

  3. 如果支付成功,服务层调用存储库为用户和给定事件创建一个“订单”。

但是,如果付款失败,我想回滚对门票可用性所做的更改。(或者如果由于某种原因为用户创建订单失败,同样的事情)。

问题是,如果服务层知道数据库事务,这似乎是一个泄漏的抽象。有更好的范例吗?

标签: databasedesign-patternstransactions

解决方案


You don't want to hold a database transaction open the whole time you are making an API request anyway... You probably want to insert a 'pending' order, then once you get the payment change the status to 'confirmed'. This lets you store details about the error and report on failed payments too


推荐阅读