gpt4 book ai didi

ruby-on-rails - 带有锁定的 Rails find_in_batches

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:29 25 4
gpt4 key购买 nike

我需要批量处理大量记录。并且每个批处理都应该在它自己的事务中处理。有没有办法把每一个batch包裹在transaction中,同时锁定batch的所有记录?

Model.scheduled_now.lock.find_in_batches do |batch|
model_ids = batch.map(&:id)
Model.update_all({status: 'delivering'}, {"id IN (?)" , model_ids})

# creates and updates other DB records
# and triggers background job
perform_delivery_actions(batch)
end

此示例中的 SELECT FOR UPDATE 是否在每批之后提交事务?或者我需要在每个批处理中手动放置内部事务 block 和锁定记录(这意味着多一个查询)?

我不想放置外部事务 block 的原因是我想分别提交每个批处理,而不是一次提交整个事务。

最佳答案

我最终实现了自己的 find_in_batches_with_lock:

def find_in_batches_with_lock(scope, user, batch_size: 1000)
last_processed_id = 0
records = []
begin
user.transaction do
records = scope.where("id > ?", last_processed_id)
.order(:id).limit(batch_size).lock.all
next if records.empty?
yield records
last_processed_id = records.last.id
end
end while !records.empty?
end

关于ruby-on-rails - 带有锁定的 Rails find_in_batches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com