lo que necesito:¿ActiveRecord realiza inserciones/eliminaciones a granel cuando está dentro de una transacción?
- asegurar actualizaciones atómicas (sin registro puede se procesa 2 veces)
- eliminación masiva para todas las 1000 filas seleccionado
@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(',')}) ")
es el mismo que
Queue.transaction do
@queue.each do |row|
Queue.do_something(row)
Queue.delete(row.id)
end
end
En mi caso tengo que borrar registros garantizando al mismo tiempo no hay otros procesos/instancias procesarán el mismo registro. Utilicé la cláusula de SQL de "FOR UPDATE" de mysql para bloquear los registros seleccionados y usar la transacción de ActiveRecord porque pensé que ActiveRecord realizaría esas eliminaciones como una sola masa eliminar sql o hacerlo más rápido. – newx
El problema es que tuve el mismo correo electrónico (expediente de COLA) entregó 2 veces – newx
realmente se pone mucho más rápido cuando se utiliza la solución ... Gracias! :-) –