我遇到了一个问题,即在看似竞争状态的情况下正在创建重复记录,因为我在创建之前运行了一个欺骗检查。
在这种情况下,我会从潜在客户中创造潜在客户。适用的代码如下:
def process_multiple
@leads = Lead.find(lead_params[:lead_ids])
user_target = User.find(lead_params[:target_user_id])
@leads.each do |lead|
pros = Prospect.find_or_create_by( lead: lead, prospectable: user_target )
pros.update_attributes(:first_name => lead.first_name,
:last_name => lead.last_name,
:middle_name => lead.middle_name,
:salutation => lead.salutation)
end
redirect_to action: 'index'
end
在before_create上运行的复制检查如下
def duplication_check
dup_prospect = Prospect.find_by_prospectable_id_and_prospectable_type_and_lead_id(self.prospectable_id, self.prospectable_type, self.lead_id)
if dup_prospect.blank?
return true
else
return false
end
end
以下是创建的重复记录的示例。注意,第二列是"潜在客户ID"潜在客户的基础。不应该有同一个潜在客户分配给同一个用户的多个潜在客户。
从上图中可以看出,正在创建重复记录。考虑到时机,它似乎是一种竞争条件。
我的两个问题是:
1)如何创建绝对防火墙以防止这种情况发生?显然,欺诈检查是不够的。 2)更重要的是,为什么首先要创建重复记录,特别是因为据我所知,Heroku的前端服务器是单线程的?
注意:我们现在使用多个dynos,但即使我们在开发期间使用单个前端dyno,也会发生这种情况。
感谢您提前提供任何帮助。