【问题标题】:ActiveRecord transactions: record created but not found in databaseActiveRecord 事务:已创建但在数据库中未找到的记录
【发布时间】:2021-06-02 17:57:55
【问题描述】:

我们在 Jruby 上使用 Rails v6.0.2.1,并在 DigitalOcean 上托管托管 PostgreSQL(使用 JDBC 适配器)。最近,我们看到某个事务创建了一些记录,将 Id 扔给 Sidekiq 进行进一步处理,但数据库中没有该记录,Sidekiq 失败,因为在 db 中找不到该记录。

事务内部也有一些 Concurrent::Future 调用。 DigitalOcean 在上述时间段内没有显示任何死锁。目前,DO 不提供 PostgreSQL 日志转储。我们如何调试这个?

在查看 Rails 生产日志时,我们发现这些事务也没有记录任何 BEGIN...COMMITROLLBACK 消息。

【问题讨论】:

    标签: jruby ruby-on-rails-6 postgresql-11 concurrent-ruby


    【解决方案1】:

    您可能一直在我假设的模型上使用after_save 回调?无论如何,问题是 Sidekiq 很快。有时,太快了。

    正在发生的事情是 Sidekiq 在提交事务之前接手工作。这将触发您看到的错误(例如RecordNotFound)。

    您有两个解决方案:只需重试作业,第二次通过时,记录很可能会再次在数据库中,或者您可以转到 after_commit 回调,这些错误将消失。

    这个问题过去曾在here 讨论过

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多