0

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

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

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

4

1 回答 1

1

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

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

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

这个问题过去在这里讨论过

于 2021-06-02T09:57:55.160 回答