Use bloqueio otimista e pessimista para modelos críticos

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: 0coluna ao modelo
  • Use essa coluna em formulários para o seu modelo
  • Capture e resolva StaleObjectErroras 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.