【问题标题】:ActiveRecord Transaction -- When Does the DB Commit Actually Happen?ActiveRecord 事务——数据库提交实际何时发生?
【发布时间】:2015-01-24 02:10:12
【问题描述】:

我遇到了 Sidekiq 找不到数据库记录的问题,我想这是因为在 Sidekiq 运行之前事务没有完全提交。我的印象是事务是在块内提交的:

User.transaction do
    # db updates here
    # commit or rollback
end

MyWorker.perform_async()

所以我的理解是不正确的,即使在块之后,数据库操作可能还没有完全提交?这就是我看到的行为。我听说过after_commit,但我正在使用服务对象并希望将逻辑保留在那里。

【问题讨论】:

  • 原来这个区块是一个嵌套事务。
  • 感谢@AndrewHallock,我在服务中遇到了完全相同的问题。之前关于 nested transaction 的评论是我所缺少的。

标签: activerecord sidekiq


【解决方案1】:

你的印象是正确的,交易在区块结束时提交。如果MyWorker 依赖于块中的数据并且块提交,那么它应该在作业执行时可见,因为作业是在块之外创建的。

【讨论】:

  • 感谢您的回复。我会更深入地研究这个。我在工作人员中获得了“ActiveRecord::RecordNotFound”,以获取应该保存在事务块中的记录。
  • 确认您拨打的是save!,而不是save。失败的验证可以被默默吞下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多