Graças ao recurso de bloqueio otimista do Active Record, você pode facilmente implementar atualizações de ACID no nível Ruby. Veja como fazer:
- Adicionar
:lock_version, :integer, default: 0
coluna ao modelo - Use essa coluna em formulários para o seu modelo
- Capture e resolva
StaleObjectError
as atualizações do seu modelo:
def add_cash(purse)
purse.cash += 100
purse.save!
rescue ActiveRecord::StaleObjectError
add_cash(purse.reload)
end
Se você quiser ter 300% de certeza, use transações adicionais e registros de bloqueio no nível do banco de dados (também conhecido como bloqueio pessimista).
Bônus : sempre use InnoDB em vez de MyISAM para aplicativos de negócios reais. Ele lida muito melhor com bloqueios e transações.