查找或创建竞争条件

2024-04-20

我正在尝试使用 ActiveRecordfind_or_create_by_*column*,但我从 Postgres 收到错误,让我知道它有时无法找到模型,并尝试插入一个模型。保持这张表的独特性非常重要,所以我添加了一个:unique => true归因于它的迁移,这样 Postgres 就会知道我是认真对待它的。

并且,失败:

ActiveRecord::StatementInvalid: PGError: ERROR: duplicate key value violates unique constraint "index_marketo_leads_on_person_id" DETAIL: Key (person_id)=(9968932) already exists. : INSERT INTO "marketo_leads" ("mkt_person_id", "synced_at", "person_updated_at", "person_id") VALUES(NULL, NULL, '2011-05-06 12:57:02.447018', 9968932) RETURNING "id"

我有这样的模型:

class User < AR::Base
  has_one :marketo_lead

  before_save :update_marketo_lead

  def update_marketo_lead
    if marketo_lead
      if (User.marketo_columns & self.changes.keys).any?  
        marketo_lead.touch(:person_updated_at) 
      end
    elsif self.id
      marketo_lead = MarketoLead.find_or_create_by_person_id(:person_updated_at => Time.now, :person_id => self.id) 
    end
  end
end

class MarketoLead
  belongs_to :user, :foreign_key => 'person_id'
end

第二种模型用于将我们的用户帐户链接到 Marketo 电子邮件服务器,并记录用户的某些字段上次修改的时间,以便我们可以在批量后台任务中推送更改的记录。

我想不出这个回调的任何原因,update_marketo_lead失败,除了某种我无法想象的竞争条件。

(请忽略“用户”与“人”共享主键的可怕之处) (使用 Rails 2.3.11、Postgres 9.0.3)


很可能在执行 find_or_create 时,找不到匹配的 person_id,因此使用了创建逻辑,但是有可能在 find_or_create 和实际 user.save 之间,另一个请求成功完成了保存事务,此时您的数据库约束导致了此异常。

我建议是捕获 StatementInvalid 异常并重试保存(最多有限次数......

begin
   user.save!
rescue ActiveRecord::StatementInvalid => error
  @save_retry_count =  (@save_retry_count || 5)
  retry if( (@save_retry_count -= 1) > 0 )
  raise error
end

请注意,无论您尝试保存用户,都应该执行此操作。所有回调和验证都在保存中发生!交易

附:我假设你的 Rails 版本支持事务:) 在 Rails 3 中,没有必要包装保存!在事务中,因为它已经在内部使用了一个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找或创建竞争条件 的相关文章

随机推荐

  • 为多个动态控件创建事件处理程序

    我有一个创建两个动态控制按钮的用户窗体 但我很难访问 name动态控件的属性 这意味着我无法正确创建事件处理程序 由于这个问题 我无法创建事件处理程序 下面显示了创建动态控件的代码以及我为事件处理程序编写的代码 无法正常运行 Option
  • 实时获取 macOS 输出设备音频缓冲区

    我试图tapmacOS 上当前选择的输出音频设备 因此我基本上有一个直通侦听器 可以监视当前正在输出的音频流而不影响它 我想将这些数据实时复制到环形缓冲区 以便我可以单独对其进行操作 Apple 文档和 过时 SO 答案的结合令人困惑 我是
  • 使用 VS2019 和 TFS2018 vnext 构建系统

    有谁知道是否可以将 VS2019 与 TFS2018 vnext 构建系统一起使用 您无法在生成定义中选择 VS2019 但可以选择 最新 作为 Visual Studio 的版本 不幸的是 这里没有选择VS2019 我已经在安装了VS20
  • 如何构建在 Android 上运行的本机(命令行)可执行文件?

    我已经成功构建了一个使用本机 JNI 库的 Android 应用程序 GUI 但是 现在我想创建一个从命令行 root 权限 运行并且根本不使用 GUI 的可执行文件 我如何构建这样的东西 从 NDK r8d 开始 这个问题可以通过更简单的
  • 在 sqlalchemy 中,有没有一种方法可以进行排序,使空单元格位于末尾,无论排序顺序如何?

    我有一个非常标准的设置 想按列排序 someselect order by asc table1 mycol 但是 我想要行 or NULL for mycol显示在结果的末尾 有没有办法做到这一点 SQLAlchemy 有一个NULLS
  • 无法将 UIViewController 类型的值转换为 PatternDetailViewController

    我试图将视图控制器向下转换为详细视图控制器 但不能 我正在使用 Core Data 第一次 错误出现在prepareForSegue方法中 内容如下 无法将 UIViewController 类型的值 0x1b81cdc 转换为 Patte
  • 定义用于执行程序的工作目录 (C#)

    我目前正在尝试从特定文件夹启动可执行文件 我下面的代码使应用程序崩溃得很奇怪 Process p new Process p StartInfo WorkingDirectory dump p StartInfo FileName s p
  • 如何使用Python检查url是否重定向到另一个url

    我想检查目标url访问后是否会重定向 我想我可以做这样的事情 req urllib2 Request url url headers headers resp urllib2 urlopen req timeout 3 code resp
  • 具有特定长度的字符串的哈希值

    有没有一种方法可以生成字符串的哈希值 以便哈希值本身具有特定的长度 我有一个生成 41 字节哈希值 SHA 1 的函数 但我需要它最大为 33 字节 由于某些硬件限制 如果我将 41 字节哈希截断为 33 我可能 当然 失去了唯一性 或者实
  • Google Webmasters API for Java 返回空网站列表

    我编写了一个简单的站点列表查询代码 它使用 Oauth 与服务帐户基于谷歌的文档 https developers google com identity protocols OAuth2ServiceAccount 所使用的身份验证密钥文
  • AJAX 中的 GET 与 POST?

    为什么 AJAX 中有 GET 和 POST 请求 因为它无论如何都不影响页面 URL 由于数据未反映到页面 URL 因此通过 AJAX 中的 GET 传递敏感数据有何区别 您应该根据您的 Web 服务要求使用正确的 HTTP 动词 当处理
  • $(this) 在函数中不起作用

    以下代码从文件加载 html 内容 我使用这个线程 https stackoverflow com questions 168963 stop jquery load response from being cached
  • 删除所有 kubernetes 命名空间中所有 pod 的命令

    查看文档后 有一个 API 调用可以删除单个 pod 但是有没有办法删除all所有命名空间中的 Pod 没有命令可以完全按照您的要求进行操作 以下是一些势均力敌的比赛 运行任何这些命令之前请务必小心 如果您使用多个集群 请确保您连接到正确的
  • 如何使用 C# 在 Selenium WebDriver 中等待警报?

    我如何将 Selenium WebDriver 设置为在接受警报而不是 Thread Sleep 之前等待警报 作为网站 有时加载速度非常慢 有时加载速度很快 Thanks 您应该应用 webdriver 等待警报正确出现 var wait
  • azure 以编程方式设置环境变量以禁用 azure 功能

    我有一个 Azure API 和一个 Azure 函数 当某些逻辑传递到 API 时 我希望它禁用 Azure 功能 这个帖子 https stackoverflow com questions 36368786 programmatica
  • 如何检查 IP 是否位于这些子网之一

    我有大约 12600 个子网 例如 123 123 208 0 20 和一个IP 我可以使用 SQLite 数据库或数组或其他任何东西 大约一个月前有人问过一个类似的问题 但是我不是在寻找针对一个子网检查一个IP 而是针对一堆子网 显然是最
  • 我无法理解“找不到模块:错误:无法解析'fs''”

    有一点空闲时间 我尝试用我喜欢的新网络技术 Typescript Pug 和 React 重新设计我的一个旧项目 一切工作正常 直到我尝试将 pug js 添加到混合中babel plugin transform react pug 无论我
  • 在 xml 中存储 url 的正确方法?

    我将数据存储在 xml 文件中 在其中一个节点中 我必须存储一个由特殊字符 如 组成的 url 我使用 amp 而不是 并且 xml 显示没有错误 但是当我进行 SAX 解析时 节点内返回的字符串值是 之后的字符串 我猜我存储网址的方式不正
  • 在本地主机上的 laravel 中将 slack 连接到 botman

    这是我在 laravel 中的路线文件 我将任何 url 与调用闭包的 botman 相匹配 该闭包为 botman 注册一个 slack 驱动程序并监听消息 hello 在闲暇时我试图设置Request URL在使用此事件订阅下http
  • 查找或创建竞争条件

    我正在尝试使用 ActiveRecordfind or create by column 但我从 Postgres 收到错误 让我知道它有时无法找到模型 并尝试插入一个模型 保持这张表的独特性非常重要 所以我添加了一个 unique gt