Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用实体存储库的全局实例在事务中保存多个对象(TypeORM)安全吗?_Typescript_Nestjs_Typeorm - Fatal编程技术网

Typescript 使用实体存储库的全局实例在事务中保存多个对象(TypeORM)安全吗?

Typescript 使用实体存储库的全局实例在事务中保存多个对象(TypeORM)安全吗?,typescript,nestjs,typeorm,Typescript,Nestjs,Typeorm,从TypeForm: 在事务中工作时最重要的限制是,在本例中始终使用提供的entity manager实例transactionalEntityManager。如果您使用全局管理器(从getManager或从connection使用管理器),您将遇到问题。您也不能使用使用全局管理器或连接来执行查询的类。必须使用提供的事务实体管理器执行所有操作 那么,使用这样的存储库是否安全: await this.myRepository.save(entities); 假设我希望所有实体都保存在一个

从TypeForm:

在事务中工作时最重要的限制是,在本例中始终使用提供的entity manager实例transactionalEntityManager。如果您使用全局管理器(从getManager或从connection使用管理器),您将遇到问题。您也不能使用使用全局管理器或连接来执行查询的类。必须使用提供的事务实体管理器执行所有操作

那么,使用这样的存储库是否安全:

    await this.myRepository.save(entities);
假设我希望所有实体都保存在一个事务中

我使用NestJS,我的存储库来自一个全局模块注入范围:

@Injectable()
export class MyService {
  constructor(
    @InjectRepository(MyEntity) private readonly myRepository: Repository<MyEntity>,
  ) {}
  ...
}
@Injectable()
导出类MyService{
建造师(
@InjectRepository(MyEntity)专用只读myRepository:Repository,
) {}
...
}
这意味着每次都是同一个存储库实例。从SQL调试日志中,我看到一个事务已正确启动,并且给定实体的所有插入操作都在一个事务中,但问题是是否存在这样的情况

什么是:

如果您使用全局管理器(从getManager或从connection使用管理器),您将遇到问题


请准确地参考?

好的,那么这里的事务是如何工作的

await getManager().transaction(async transactionalEntityManager => {
    
});
您有一个EntityManager的专用实例,它将收集将在同一事务中运行的查询。你要问的警告是你不能做那样的事

await getManager().transaction(async transactionalEntityManager => {
    await transactionalEntityManager.save(users);
    await getRepository(Photo).save(photos); 
});
因为未在transactionalEntityManager上运行的部分不会注册为与第一个事务相同的事务的作用域


在您的情况下,一切都很好,因为save()为signal save操作创建了自己的事务。当您需要在一个事务中执行多个保存时,您需要自己处理它。在这种情况下,您必须使用与此处所述相同的queryrunner实例

,但在这种情况下,我通过nestjs获得的是一个单例,因此我总是使用相同的实例。这不是个问题吗?你能解释一下为什么用你写的东西做坏事吗?我改变了答案