O Eloquent ORM é muito bom, embora eu esteja me perguntando se existe uma maneira fácil de configurar transações MySQL usando innoDB da mesma maneira que o PDO, ou se eu teria que estender o ORM para tornar isso possível.
96
Você consegue fazer isso:
DB::transaction(function() {
//
});
Tudo dentro do Closure é executado dentro de uma transação. Se ocorrer uma exceção, ele será revertido automaticamente.
Discussed in more detail here
link está morto.Se você não gosta de funções anônimas:
Atualização : Para laravel 4, o
pdo
objeto não é mais público, então:fonte
DB::beginTransaction()
&DB::commit()
&DB::rollback()
. Isso seria um pouco mais limpo.DB::connection()->getPdo()->beginTransaction();
DB::transaction
callback com é ainda mais limpo, mas a desvantagem é que se você precisar especificar diferentes manipuladores para diferentes exceções, você terá que voltar para a técnica de tentativa / capturaSe você quiser usar o Eloquent, também pode usar este
Este é apenas um exemplo de código do meu projeto
fonte
question->id
expressão no retorno de chamada da transação retorna zero.Se você quiser evitar fechamentos e ficar feliz em usar fachadas, o seguinte mantém as coisas boas e limpas:
Se alguma instrução falhar, o commit nunca ocorrerá e a transação não será processada.
fonte
Tenho certeza de que você não está procurando uma solução de fechamento, tente uma solução mais compacta
fonte
Por algum motivo, é muito difícil encontrar essas informações em qualquer lugar, então decidi postá-las aqui, pois meu problema, embora relacionado às transações do Eloquent, estava exatamente mudando isso.
Depois de ler ESTA resposta stackoverflow, percebi que minhas tabelas de banco de dados estavam usando MyISAM em vez de InnoDB.
Para que as transações funcionem no Laravel (ou em qualquer outro lugar que pareça), é necessário que suas tabelas sejam configuradas para usar InnoDB
Por quê?
Citando documentos do MySQL Transactions and Atomic Operations ( aqui ):
fonte
Se ocorrer alguma exceção, a transação será revertida automaticamente.
Formato de transação do Laravel Basic
fonte