Quiero extender transaction para que en vez de hacer esto
Tabla.transaction do
llaves do |key|
fila = Tabla.find key
fila.calculo_u_operacion
fila.save
end
end
Haga esto
filas = []
Tabla.transaction do
llaves.each do |key|
fila = Tabla.find key
fila.proceso
filas << fila
end
filas.each do |f|
f.save
end
end
O sea, deferir los save para que guarde todas la filas al final de la
transaccion, o sea los proceso como un solo “bulto”
Alguien me puede decir si ya hay algo similar a esto escrito?
Su finalidad no es obvia, se utiliza para sistemas para bases de datos
con alta concurrencia de transacciones. En estos sistemas los bloqueos
sobre registros deben durar la menor cantidad de tiempo posible. Cuando
una transaccion actualiza mas de una fila en un tabla cada fila queda
bloqueda para el resto de la aplicaciones hasta que la transaccion
finalice.
En sistemas de alta concurrencia de transacciones cada transaccion debe
ser lo mas corta en tiempo posible, o sea todos los updates/inserts
deben ejecutarse sin tiempos “muertos”.
Estoy implementando esta funcionalidad para un sistema que ya esta en
produccion, que cada manana corre un proceso de calculos que duran
varios minutos. Y que ha trabado (unas cuantas veces) otras
aplicaciones.
Gracias de antemano