Pergunta

É o caso que todo o verbo repousante está sob um único todas as transações abrangente? Ou seja, se eu levantar um erro na validação ou retornos de chamada em qualquer ponto no manuseio de um UPDATE, DELETE ou CREATE operação, é cada operação de banco de dados que eu possa ter realizado em retornos de chamada anteriores costas também rolou? Sucintamente, não levantando um erro em qualquer chamada de retorno ou validação make-lo de tal forma que nenhuma mudança ocorre no banco de dados para que a ação verbo?

Foi útil?

Solução

É o caso que todo o verbo repousante está sob um único todas as transações abrangente?

Não

Se eu levantar um erro na validação ou retornos de chamada em qualquer ponto no manuseio de um UPDATE, DELETE ou CREATE operação, é cada operação de banco de dados que eu possa ter realizado em retornos de chamada anteriores também revertida?

Não.

não levantar um erro em qualquer chamada de retorno ou validação make-lo de tal forma que nenhuma mudança ocorre no banco de dados para que a ação verbo?

Não.

Se você deseja esse comportamento você pode criar explicitamente transações em seu controlador (veja os exemplos fornecidos por outros usuários), ou usar um around_filter para anexar o comportamento de todas as suas ações repousante.

Outras dicas

Por padrão não há código de banco de dados escrito dentro de uma transação, você precisa dizer a ele para fazer isso no código.

def create
  Model.transaction do
    Model.create!(params[:model])
    Model.association.create!(params[:association])
  end
  rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
    flash[:notice] = "That record could not be saved."
    render :action => "new"
end

Usando o #create! métodos tentará salvar o registro e se não eles vão gerar uma exceção que, então, reverter qualquer código já realizado dentro do bloco de transação.

Se você não salvar a ação que você será redirecionado para (eu acho) um 405.html no diretório público, se houver.

Alguns métodos (criar, destruir) ir para o banco de dados imediatamente. Transações ocorrem usando o método transação em classes derivadas de ActiveRecord da seguinte forma:

Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end

(Este exemplo é para vários bancos de dados. Para um único banco de dados, você só precisa de uma transação.)

Você pode então reversão nessas transações e exceções lançadas dentro da transação são propagadas após a reversão.

Isso depende das operações de banco de dados tendo.

NB:. Salvar e destruir são envolvidos em transações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top