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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – ActiveRecord在事务内部是否批量执行插入/删除?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要的:

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

  1. @queue = Queue.where("col = 1").limit(1000)
  2. ids = []
  3. @queue.each do |row|
  4. Queue.do_something(row)
  5. ids << row.id
  6. end
  7.  
  8. Queue.delete_all("id in (#{ids.join(',')}) ")

是相同的

  1. Queue.transaction do
  2. @queue.each do |row|
  3. Queue.do_something(row)
  4. Queue.delete(row.id)
  5. end
  6. end

解决方法

对于插入:

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

所以:

  1. Queue.transaction do
  2. @queue.each do |row|
  3. # an INSERT is done here
  4. end
  5. end

将要快于:

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

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

对于删除

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

猜你在找的Ruby相关文章