在我的数据库中,我有一个带有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方法没有使用相同的连接,因此也没有使用相同事务。
您应该能够在同一事务中看到当前事务的效果,即使没有提交。