2011-10-24 12 views
5

Cercando di capire come viene gestita la concorrenza in Ruby On Rails.Concorrenza con sicurezza del database in ROR

Come si ottiene un segmento di codice per bloccare le righe nel database e forzare i rollback quando necessario?

Più specificatamente, C'è un modo per forzare un determinato segmento di codice a completare completamente e se non il rollback? Sto cercando di aggiungere la cronologia alle transazioni nel mio progetto e non voglio che le transazioni vengano salvate senza che la cronologia venga salvata, quindi se il server si trova tra le due azioni (salvando la transazione e salvando la cronologia) il database potrebbe andare in uno stato illegale.

risposta

5

Si desidera guardare ActiveRecord Transactions e Pessimistic Locking.

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

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

può se le istruzioni sul database devono essere eseguite anche all'interno della transazione? – Nayish

+0

Tutto ciò che vuoi può andare all'interno del blocco della transazione, quindi sì, se le affermazioni possono essere fatte. –

+0

e se alla fine il if avrebbe fallito qualcosa cambiando da una transazione diversa? – Nayish

1

Sì, è possibile implementare una transazione in Rails. Un esempio:

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

Maggiori informazioni here

Problemi correlati