加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ActiveRecord在事务内部是否批量执行插入/删除

发布时间:2020-12-16 21:52:24 所属栏目:百科 来源:网络整理
导读:我需要的: 确保原子更新(无记录可以处理2次) 所有1000行的批量删除 @queue = Queue.where("col = 1").limit(1000)ids = []@queue.each do |row| Queue.do_something(row) ids row.idendQueue.delete_all("id in (#{ids.join(',')}) ") 是相同的 Queue.trans
我需要的:

确保原子更新(无记录可以处理2次)
>所有1000行的批量删除

@queue = Queue.where("col = 1").limit(1000)
ids = []
@queue.each do |row|
    Queue.do_something(row)
    ids << row.id
end

Queue.delete_all("id in (#{ids.join(',')}) ")

是相同的

Queue.transaction do
    @queue.each do |row|
        Queue.do_something(row)
        Queue.delete(row.id)
    end
end

解决方法

对于插入:

使用事务时,ActiveRecord不会执行批量插入.但是,由于使用单个事务来执行所有INSERT语句,而是使用每个INSERT语句,而是使用一个事务,因此它会加快速度.

所以:

Queue.transaction do 
  @queue.each do |row|
    # an INSERT is done here
  end
end

将要快于:

@queue.each do |row|
  # an INSERT is done here
end

有关如何真正做批量插入的更多信息,请查看这个article.

对于删除:

ActiveRecord delete_all调用是一个单独的SQL DELETE语句,所以我猜你可以将其视为批量删除(不需要使用这里的事务,因为它已被ActiveRecord封装在一个事务中).在每个记录上调用delete时不是这种情况,这将导致多个SQL DELETE语句,从而启动和提交多个事务并且整体性能较差.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读