首页 > 解决方案 > TypeORM 在提供者级别运行事务?

问题描述

我有两张桌子accountaddress. account依靠address意义来创造一个account,你必须创造一个address第一个并得到它address.id

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

因此我必须运行一个事务

如果我在我的提供程序中运行一个事务,它是注入所有必需服务的类,以便执行我需要的操作,即创建帐户,在我的情况下它使用addressServiceand accountService,我被告知这是一种反模式这样做是因为事务和与数据库相关的所有内容都必须在repository.

但是怎么做?我必须在两个不同的存储库中运行操作,addressRepository并且accountRepository.

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

标签: nestjstypeorm

解决方案


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

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


推荐阅读