如何在Typeorm事务中使用服务方法

时间:2019-11-04 10:35:13

标签: nestjs typeorm typeorm-activerecord

我已经阅读了有关typeorm中事务的信息。

@Transaction()
save(user: User, @TransactionRepository(User) userRepository: Repository<User>) {
    return userRepository.save(user);    
}

我有一个带有多个模块和服务的nestjs应用程序。我需要做的是在事务中调用不同的服务方法。但是@TransactionRepository为我提供了repository。因此,我应该怎么做才能在内部调用多种服务方法来实现事务。像

class Module3Service{
    constructor(
    private readonly module1service: Moudle1Service,
    private readonly module2service: Module2Service
    ){}

    @Transaction()
    save() {
        this.module1service.create()
        this.module2service.create()
    }

我不知道该怎么实现。并纠正我,如果我错了,可能的解决方案是更改moduleservice依赖项(module1service依赖关系=> module1repositoroy)以更改为我们从tranction方法中从@TransactionRepository(Module1Enity) module1repository: Repository<Module1Entity>获得的新存储库实例。或任何其他解决方案,请帮助

我正在使用postgres

2 个答案:

答案 0 :(得分:0)

如果我正确回答了您的问题,则可以使用@TransactionManager() entityManager?: EntityManager并将entityManager传递给服务 例如:

class Module3Service{
    constructor(
    private readonly module1service: Moudle1Service,
    private readonly module2service: Module2Service
    ){}

    @Transaction()
    save(@TransactionManager() entityManager?: EntityManager) {
        this.module1service.create(entityManager)
        this.module2service.create(entityManager)
    }
class Module1Service{
    save(entityManager: EntityManager) {
        entityManager.save()
    }
class Module2Service{
    save(entityManager: EntityManager) {
        entityManager.save()
    }

答案 1 :(得分:-1)

在单元测试期间,您将无法使用@Transaction()

我建议使用Typeorm's manager getManager().transaction( () => { ... } ),它不需要特定的存储库。在提供给.transaction的回调中执行的所有操作都将在单个事务下进行。