TypeORM在提供程序级别运行事务?

时间:2019-08-26 11:18:28

标签: nestjs typeorm

我有两个表accountaddressaccount依赖于address的含义才能创建account,您必须先创建一个address并将其命名为address.id

address创建失败或account创建失败的情况下,我不能依靠数据库。

因此,我必须进行交易

如果我在提供者中运行交易,该类将注入所有必需的服务以执行我需要的操作(即创建帐户),在本例中,它使用{{ 1}}和addressService,有人告诉我这样做是一种反模式,因为事务和与数据库相关的所有事物都必须在accountService中运行。

但是如何?我必须在两个不同的存储库repositoryaddressRepository中运行操作。

在两个不同服务上使用多个存储库时,启动和提交事务的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

我建议您创建另一个服务(addressAcountService),并且仅在您使用两个实体的操作中使用该服务,这是我认为最安全的方法。

在服务方法上,我没有看到在存储库逻辑中添加一层的任何反模式,因为我看到将存储库分为服务可以使系统更加可扩展 maintainable (可维护性),因为您可以防止代码重复,甚至可以阻止访问项目中的其他位置,您不希望他们在没有控制的情况下修改数据库,并且如果将来要更改为,则甚至可以防止这种情况一个不同的 DBMS 甚至是 ORM ,您只需更改依赖关系,而无需更改CRUD操作的整个实体逻辑。举个例子,假设在应用程序的早期开发过程中,您决定在用户​​需要时硬 DELETE 删除数据库中的所有行,因为系统开始增长,您检测到删除操作没有最安全的操作,因为您有很多级联的删除操作,并且在某些情况下,删除一行需要很长时间(我在这里有点夸张),然后您想要将其更改为软( UPDATE 一个标志)删除,如果您要使用存储库进行所有操作,那将是一件令人头疼的事情,因为您需要在级联时更改使用存储库及其关系的代码的每个部分,不仅仅在谈论 Delete 操作,您需要照顾 SELECTS UPDATES ,甚至在 INSERTs 您在其中寻找独特的属性。在服务方法上,您更改了对不同控制器可用的操作中的逻辑,就是这样,甚至您可以创建另一个服务并替换依赖项。