我有一个长时间运行的后台作业,它更新多个数据库记录,因此我将其包含在数据库事务中。我还有一个JobStatus
数据库记录,其中包含一个percent_complete
字段,用于让用户知道后台作业完成的时间。当后台作业运行时,网站轮询服务器以从相关联的JobStatus
记录获得percent_complete
值。
在 Package 在数据库事务中的后台作业中,如何在数据库事务之外更新JobStatus
记录,以便在网站轮询时返回当前的percent_complete
值?
class BackgroundJob < ApplicationJob
def perform(job_status_id)
job_status = JobStatus.find(job_status_id)
job_status.update(percent_complete: 0)
ActiveRecord::Base.transaction do
# ... update some records
job_status.update(percent_complete: 25)
# ... update some more records
job_status.update(percent_complete: 50)
# ... update some more records
job_status.update(percent_complete: 75)
# ... finish updating records
job_status.update(percent_complete: 100)
end
end
end
字符串
如何在数据库事务之外只对job_status
记录进行更新?
我用的是Ruby on Rails 7.0
1条答案
按热度按时间zvms9eto1#
因此,您需要为
JobStatus
模型使用与事务中的连接不同的数据库连接。有几种方法可以从池explained here中手动检出您自己的连接,但是您需要使用原始SQL进行更新。就我个人而言,我会使用Multiple Database stuff,并将
JobStatus
模型设置为从一个单独的类继承一个connects_to
,以确保它使用不同的DB连接(到同一个DB):于是:
数据库.yml
字符串
app/models/job_status_abstract.rb
型
app/models/job_status.rb
型