如何解决ActiveRecord 事务:记录已创建但未在数据库中找到
我们在 Jruby 上使用 Rails v6.0.2.1,并在 DigitalOcean 上托管托管 Postgresql(使用 JDBC 适配器)。最近,我们发现某个事务创建了一些记录,将 Id 交给 Sidekiq 进行进一步处理,但该记录不在数据库中,并且 Sidekiq 失败,因为在 db 中找不到该记录。
事务内部也有一些 Concurrent::Future 调用。 DigitalOcean 在上述时间段内没有出现任何死锁。目前,DO 不提供 Postgresql 日志的转储。我们如何调试?
在查看 Rails 生产日志时,我们发现这些事务也没有记录任何 BEGIN
...COMMIT
OR ROLLBACK
消息。
解决方法
我假设您可能一直在您的模型上使用 after_save
回调?无论如何,问题是 Sidekiq 速度很快。有时,太快了。
发生的事情是,Sidekiq 在提交事务之前 接手工作。这将触发您看到的错误(例如 RecordNotFound
)。
您有两种解决方案:简单地重试作业,在第二次通过时,记录很可能会再次出现在数据库中,或者您可以转到 after_commit
回调,这些错误将消失。
此问题已在 here 过去讨论过
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。