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
依赖于块中的数据并且块提交,那么当作业执行时它应该是可见的,因为作业是在块外创建的。
我遇到 Sidekiq 找不到数据库记录的问题,我想这是因为在 Sidekiq 运行之前事务没有完全提交。我的印象是交易是在区块内提交的:
User.transaction do
# db updates here
# commit or rollback
end
MyWorker.perform_async()
所以我的理解是不是不正确,即使在块之后,数据库操作可能还没有完全提交?这就是我看到的行为。我听说过 after_commit
,但我正在使用服务对象并希望将逻辑保留在那里。
你的印象是正确的,事务在块的末尾提交。如果 MyWorker
依赖于块中的数据并且块提交,那么当作业执行时它应该是可见的,因为作业是在块外创建的。