在事务中键入尚未提交的查找行



在我的数据库中,我有一个带有taxId UQ列的"companies"表。在我的代码中,我有一个companiesRepository类,它有树方法:

findCompany:执行SELECT以按UQ(taxId(查找公司createCompany:执行INSERTfindOrCreate:接收taxId并尝试使用findCompany查找,如果找不到,则调用createCompany插入此公司。

由于在我的端点上,我收到了公司和发票信息的树形结构数据,我使用TypeORM作为我的ORM,它queryRunner来管理事务,并在流程中出现问题时回滚。

问题是,当我收到并注册发票时,我需要通过taxId将其关联到一个companyRow,如果该公司没有注册,我注册,否则我只从银行选择该公司(使用此findOrCreate方法(

问题是,在相同的请求负载上,我可以收到许多发票。假设我从一家尚未注册的公司收到发票,我的findOrCreate companyRepository方法将找不到,并将注册该公司。在这之后,从同一家公司收到另一张发票可能是很常见的,因为我还没有提交交易,因为整个端点流还没有完成,findOrCreate将找不到这家公司,并试图再次创建,毕竟通过违反UQ约束抛出了一个execution。

我该如何解决这个问题?

谢谢。

使用的技术:

"nestjs/common":"9.0.0〃;,"nestjs/core":"9.0.0〃;,"nestjs/typeorm":"9.0.1〃;,"typeorm":"0.3.10〃;"pg":"8.8.0";,

我的想法是:停止使用transacion来创建公司(现在已经奏效了(,但这似乎有点不对。

甚至,对于公司来说,不要使用端点流queryManager,使用自己的queryManager并在创建后立即提交,这样它就可以在创建后创建。

但我想知道是否可以将所有内容都保存在这个端点/全局查询管理器中,即使还没有在数据库中提交,也仍然能够找到一行。

听起来您的findOrCreate方法没有使用相同的连接,因此也没有使用相同事务。

您应该能够在同一事务中看到当前事务的效果,即使没有提交。

最新更新