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

时间:2014-06-30 15:48:03

标签: 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_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"潜在客户的基础。不应该有同一个潜在客户分配给同一个用户的多个潜在客户。

example of the duplicate records created

从上图中可以看出,正在创建重复记录。考虑到时机,它似乎是一种竞争条件。

我的两个问题是:

1)如何创建绝对防火墙以防止这种情况发生?显然,欺诈检查是不够的。 2)更重要的是,为什么首先要创建重复记录,特别是因为据我所知,Heroku的前端服务器是单线程的?

注意:我们现在使用多个dynos,但即使我们在开发期间使用单个前端dyno,也会发生这种情况。

感谢您提前提供任何帮助。

0 个答案:

没有答案