2011-10-24 19 views
5

Tratando de averiguar cómo se maneja la concurrencia en Ruby On Rails.Concurrencia segura de la base de datos en ROR

¿Cómo obtengo un segmento de código para bloquear líneas en la base de datos y forzar retrocesos cuando es necesario?

Más concretamente, ¿Hay alguna forma de forzar un cierto segmento de código para que se complete por completo y, si no retroceder? Estoy buscando agregar el historial a las transacciones en mi proyecto y no quiero que las transacciones se comprometan sin que se guarde el historial, así que si el servidor se encuentra entre las dos acciones (guardando la transacción y guardando el historial) la base de datos puede entrar un estado ilegal.

Respuesta

5

Usted quiere mirar ActiveRecord Transactions y Pessimistic Locking.

Account.transaction do 
    account = Account.find(account_id) 
    account.lock! 

    if account.balance >= 100 
    account.balance -= 100 
    account.save 
    end 
end 
+0

¿Se pueden hacer declaraciones en la base de datos también dentro de la transacción? – Nayish

+0

Cualquier cosa que desee puede ir dentro del bloque de transacción, entonces sí, si se pueden hacer declaraciones. –

+0

y si al final el if hubiera fallado al cambiar algo de una transacción diferente? – Nayish

1

Sí, tiene una forma de implementar una transacción en Rails. Un ejemplo:

YourModel.transaction do 
    rec1.save! 
    rec2.save! 
end 

Más información here

Cuestiones relacionadas