我正在实施一个使用工作池的导入器(由Celery和RabbitMQ提供支持)。导入的数据包括由唯一用户ID标识的用户数据,并存储在PostgreSQL数据库中。
通常我会收到很多导入文件,并且会同时处理这些文件。在多个文件中,可以存在相同用户ID的数据。这导致2个导入尝试同时处理相同用户ID 的数据的情况。
如果特定用户ID的数据已存在,则没有问题:使用SELECT ... FOR UPDATE
锁定数据库行。但是,如果没有与ID相关联的数据,则两个导入都会遇到麻烦的情况:两者都尝试INSERT
- 使用相同的用户ID。
由于用户ID字段具有UNIQUE
约束,因此事务失败。
如何防止这种情况发生?除了锁定整个表之外还有其他选择吗?