ActiveRecord事务:已创建但在数据库中找不到的记录



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

事务内部也有一些Concurrent::Future调用。DigitalOcean在上述时间段内没有出现任何僵局。目前,DO不提供PostgreSQL日志的转储。我们如何调试它?

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

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

现在发生的情况是,Sidekiq在提交事务之前拾取作业。这将触发您看到的错误(例如RecordNotFound(。

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

这个问题在过去的中已经讨论过了

相关内容

  • 没有找到相关文章

最新更新