Typescript 使用实体存储库的全局实例在事务中保存多个对象(TypeORM)安全吗?
从TypeForm: 在事务中工作时最重要的限制是,在本例中始终使用提供的entity manager实例transactionalEntityManager。如果您使用全局管理器(从getManager或从connection使用管理器),您将遇到问题。您也不能使用使用全局管理器或连接来执行查询的类。必须使用提供的事务实体管理器执行所有操作 那么,使用这样的存储库是否安全:Typescript 使用实体存储库的全局实例在事务中保存多个对象(TypeORM)安全吗?,typescript,nestjs,typeorm,Typescript,Nestjs,Typeorm,从TypeForm: 在事务中工作时最重要的限制是,在本例中始终使用提供的entity manager实例transactionalEntityManager。如果您使用全局管理器(从getManager或从connection使用管理器),您将遇到问题。您也不能使用使用全局管理器或连接来执行查询的类。必须使用提供的事务实体管理器执行所有操作 那么,使用这样的存储库是否安全: await this.myRepository.save(entities); 假设我希望所有实体都保存在一个
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获得的是一个单例,因此我总是使用相同的实例。这不是个问题吗?你能解释一下为什么用你写的东西做坏事吗?我改变了答案