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次) @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语句,从而启动和提交多个事务并且整体性能较差. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |