我正在为ASP.NET Core 2.0应用程序编写ETL /数据提取过程。工作流程如下:
CSV已上传到Amazon S3
触发初始lambda函数,将csv“块”化为 许多小文件,每个文件有1000条记录。原因是 解决Lambda的5分钟运行时限制。
这些“块”文件中的每一个都会触发另一个lambda函数 实际上处理记录并插入/更新Postgres 数据库。此函数使用 Parallel.ForEach 循环 进一步增加并发性。
正在加载的数据基本上等于业务应用程序的用户数据,但跨越多个表。我遇到的问题是,当两个具有相同 new 相关实体的用户基本上同时导入时,我最终会遇到一个唯一的约束错误,因为他们都找不到相关的实体并尝试创建它,但当然一个赢,然后第二个失败,当它也试图创建它。
我熟悉在使用行级锁定等更新记录时如何处理并发性,但对于插入,我不知道如何最好地处理这种情况,可能会尝试捕获错误然后查找现有实体并将其附加到新用户。在其他语言和框架中,我使用了CreateOrUpdate类功能来处理这个问题,但我在EF Core中找不到类似的东西。