【发布时间】:2015-02-28 11:39:34
【问题描述】:
这很简单,我正在运行一个查找 Cogs 的爬虫。 Cogs 可以属于一个单一的 Widget。有时它会找到一堆应该属于同一个 Widget 的 Cog。它在 Cog 模型中运行:
# Find or create widget
match = Widget.where("name ILIKE (?)", name).first
match = Widget.create(name: name) unless match
所有并行运行的延迟作业本质上是这样的:
- CREATE Cog, name: "cog1", (Widget, name: "Foo")
- CREATE Cog, name: "cog2", (Widget, name: "Foo")
- CREATE Cog, name: "cog3", (Widget, name: "Foo")
- CREATE Cog, name: "cog4", (Widget, name: "Foo")
这是不可避免的,但我认为会由上面的匹配代码处理。我在 Widget 模型中也有这个:
validates :name, presence: true, uniqueness: true
不幸的是,由于 4 个 DelayedJob 工作人员在 4 个内核上运行,这些作业在完全相同的时间运行,导致尽管进行了两项检查,仍会创建多个小部件。如何在创建小部件时防止出现竞争条件,以免出现重复?
【问题讨论】:
标签: activerecord delayed-job race-condition