new*_*ewx 12 activerecord transactions ruby-on-rails ruby-on-rails-3
我需要的:
@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语句,从而启动和提交多个事务,并降低整体性能.