在事务内部,ActiveRecord是否批量执行插入/删除操作?

new*_*ewx 12 activerecord transactions ruby-on-rails ruby-on-rails-3

我需要的:

  1. 确保原子更新(没有记录可以处理2次)
  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(',')}) ")
Run Code Online (Sandbox Code Playgroud)

是相同的

Queue.transaction do
    @queue.each do |row|
        Queue.do_something(row)
        Queue.delete(row.id)
    end
end
Run Code Online (Sandbox Code Playgroud)

mbr*_*ing 16

对于插入:

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

所以:

Queue.transaction do 
  @queue.each do |row|
    # an INSERT is done here
  end
end
Run Code Online (Sandbox Code Playgroud)

会比以下更快:

@queue.each do |row|
  # an INSERT is done here
end
Run Code Online (Sandbox Code Playgroud)

有关如何真正进行批量插入的更多信息,请查看此文章.

删除:

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