Ruby on rails Heroku Rails应用程序中某些操作上创建的重复记录

Ruby on rails Heroku Rails应用程序中某些操作上创建的重复记录,ruby-on-rails,postgresql,duplicates,race-condition,Ruby On Rails,Postgresql,Duplicates,Race Condition,我遇到了一个问题,即在看似竞争的条件下创建重复记录,因为我在创建之前运行了一个连接到的重复检查 在这种情况下,我是从潜在客户中创造潜在客户。适用代码如下: 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_

我遇到了一个问题,即在看似竞争的条件下创建重复记录,因为我在创建之前运行了一个连接到的重复检查

在这种情况下,我是从潜在客户中创造潜在客户。适用代码如下:

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
创建前运行的复制检查如下所示

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的前端服务器是单线程的

注意:我们现在确实使用了多个dyno,但即使在开发过程中使用了单个前端dyno,这种情况也会发生


感谢您提前提供的帮助。

如果不存在,您是否正在尝试实施upsert/create?@CraigRinger否,我只是在处理表单中的项目,并将“潜在客户”转换为“潜在客户”。无论出于何种原因,我经常会被欺骗,我也不知道为什么会创建竞态条件。@CraigRinger仅供参考-在添加复制前签入以尝试解决复制问题之前,添加了“查找”或“创建”依据。不用说,它不起作用。在执行插入请求之前,您可能希望在字典/数组中执行重复数据消除,以确保您没有尝试处理几乎相似但实际上略有不同的记录。至少作为对单个dyno的测试,只是为了覆盖这个基础。@liam它肯定不是数组中的一个复制品,我已经检查了数组的原始形式。这些记录是根据来源线索和相关用户进行复制的-不可能有“类似”的记录。它要么是来自潜在客户并分配给该用户的潜在客户,要么不是。这非常令人沮丧。然而,我认为我们已经开始追踪到一个潜在的chrome提交错误。