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]
simplelogica.net
–
Saludos
Atte
Jean Marcel Droguett A.