当前位置: 首页 > 知识库问答 >
问题:

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

百里意智
2023-03-14

从关于交易的TypeForm文档:

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

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

    await this.myRepository.save(entities);

假设我希望所有实体都保存在一个事务中?

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

@Injectable()
export class MyService {
  constructor(
    @InjectRepository(MyEntity) private readonly myRepository: Repository<MyEntity>,
  ) {}
  ...
}

这意味着每次都是相同的存储库实例。从SQL调试日志中,我看到一个事务被正确启动,给定实体的所有插入操作都在一个事务中,但问题是是否有一个角落的情况下,这将不起作用?

什么做:

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

具体指什么?

共有1个答案

卞俊哲
2023-03-14

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

await getManager().transaction(async transactionalEntityManager => {
    
});

您有一个EntityManager的专用实例,它将收集将在同一事务中运行的查询。你要问的警告是你不能做那样的事

await getManager().transaction(async transactionalEntityManager => {
    await transactionalEntityManager.save(users);
    await getRepository(Photo).save(photos); 
});

因为未在transactionalEntityManager上运行的部分不会注册为与第一个事务相同的事务的作用域。

在您的情况下,一切都很好,因为save()为signal save操作创建了自己的事务。当您需要在一个事务中执行多个保存时,您需要自己处理它。在这种情况下,必须使用与此处所述相同的查询运行程序实例https://docs.nestjs.com/techniques/database#transactions

 类似资料:
  • 我有一个实体像下面在Nestjs应用程序与typeorm为mongoDB: 我的其他实体扩展了审计,在我的应用程序中,我使用jwt来验证用户。 问题是,当我想保存一个实体,我不知道如何设置createdBy与@Before插入钩子... 我知道请求中有用户,但我不知道将用户引入方法的正确方法是什么?

  • 当我保存以下实体时,它在另一个对象中复制相同的值: 例如,在我的struts项目(屏幕)中,如果我更改shipmentShipper字段的值,那么Shipment收货人也将使用相同的值进行更新。 实体: 仓库类: JSP中的字段映射(工作正常): 请检查屏幕截图,我将发货人更改为C4并保存。收货人也被选为C4。请注意,两个选择都使用相同的数据列表填充。(客户名单)

  • 我有几个实体,并使用Spring Data JPA存储库与规范查询我的数据库。因此,我创建了一个泛型类< code>SpecBuilder来基于查询描述(< code>MyQueryDescriptor)构建我的查询。 我的存储库: 和 现在有三件事我不太确定:< br> 1) 使用泛型SpecBuilder是一个干净的设计吗? 2) 有没有办法避免为每个实体编写这些存储库接口?假设一个通用存储库

  • 我目前正在使用ReactJS构建一个单页应用程序。 我读到不使用的原因之一是因为XSS漏洞。 由于 React 会转义所有用户输入,现在使用 是否安全?

  • 问题内容: 是否可以使用Spring Data Rest为同一JPA实体发布两个不同的存储库?我给两个存储库提供了不同的路径和rel-name,但是这两个存储库中只有一个可以用作REST端点。我拥有两个存储库的要点是,其中一个是摘录,仅显示实体的基本字段。 问题答案: 可怕的部分不仅是你只能有1个弹簧数据仓库休息(@RepositoryRestResource)每实体,但也说,如果你有一个普通JP