ActiveRecord: deferir save's en una transaccion

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

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

Hola Esteban

Entiendo el problema, pero en el ejemplo que das no te resulta mejor
sacar
el primer ciclo de la transacción:

filas = []
llaves.each do |key|
fila = Tabla.find key
fila.proceso
filas << fila
end

Tabla.transaction do
filas.each do |f|
f.save
end
end

El día 29/02/08, Esteban [email protected] escribió:

  f.save

sobre registros deben durar la menor cantidad de tiempo posible. Cuando

Gracias de antemano


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Saludos
Atte

Jean Marcel Droguett A.