ActiveRecord事务——DB提交实际上何时发生?

ActiveRecord事务——DB提交实际上何时发生?,activerecord,sidekiq,Activerecord,Sidekiq,我对Sidekiq没有找到DB记录有一个问题,我想这是因为在Sidekiq运行之前事务没有完全提交。我的印象是交易是在区块内进行的: User.transaction do # db updates here # commit or rollback end MyWorker.perform_async() 那么,我的理解是否不正确,即即使在阻塞之后,DB操作也可能没有完全提交?这就是我看到的行为。我听说过提交后的,,但我使用的是服务对象,希望将逻辑保留在那里。您的印象是正确

我对Sidekiq没有找到DB记录有一个问题,我想这是因为在Sidekiq运行之前事务没有完全提交。我的印象是交易是在区块内进行的:

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

MyWorker.perform_async()

那么,我的理解是否不正确,即即使在阻塞之后,DB操作也可能没有完全提交?这就是我看到的行为。我听说过提交后的
,但我使用的是服务对象,希望将逻辑保留在那里。

您的印象是正确的,事务在块的末尾提交。如果
MyWorker
依赖于块中的数据,并且块提交,那么当作业执行时,它应该是可见的,因为作业是在块之外创建的。

感谢您的回复。我会更深入地研究这个问题。对于本应保存在事务块中的记录,我在worker中获得'ActiveRecord::RecordNotFound'。请验证您正在调用
save和非
保存
。一个失败的验证可以被默默地接受。原来这个块是一个嵌套事务。谢谢@AndrewHallock,我的服务中也有同样的问题。前面关于嵌套事务的注释是我所缺少的。