我们在Jruby上使用Rails v6.0.2.1,托管PostgreSQL(使用JDBC适配器(托管在DigitalOcean上。最近,我们看到了一些问题,某个事务创建了一些记录,并将Id扔给Sidekiq进行进一步处理,但该记录不在数据库中,并且Sidekiq失败,因为在数据库中找不到该记录。
事务内部也有一些Concurrent::Future调用。DigitalOcean在上述时间段内没有出现任何僵局。目前,DO不提供PostgreSQL日志的转储。我们如何调试它?
在查看Rails生产日志时,我们发现这些事务没有记录任何BEGIN
。。。COMMIT
或ROLLBACK
消息。
我想您可能在模型上使用了after_save
回调?无论如何,问题是Sidekiq的速度很快。有时,太快了。
现在发生的情况是,Sidekiq在提交事务之前拾取作业。这将触发您看到的错误(例如RecordNotFound
(。
您有两种解决方案:只需重试作业,在第二次传递时,记录很可能会再次出现在数据库中,或者您可以转到after_commit
回调,这些错误将消失。
这个问题在过去的中已经讨论过了