ActiveRecord 事务——数据库什么时候提交实际发生?

ActiveRecord Transaction -- When Does the DB Commit Actually Happen?

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

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

MyWorker.perform_async()

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

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