borda_esquerda
borda_direita

Transactions com Cakephp e Mysql

 A algum tempo precisei utilizar transactions em um projeto grande desenvolvido em Cakephp e Mysql, e depois de muito esforço e pesquisa em fórums e grupos de discussão consegui fazer funcionar, como mostro a seguir.

Primeiro o tipo das tabelas tem que ser "InnoDB". ALTER TABLE table_name type=InnoDB;
  Por padrão o MySQL é executado em modo autocommit. Isto significa que assim que você
executa uma instrução que atualiza (modifica) uma tabela, o MySQL armazena a atualização
no disco. Se você estiver usando tabelas com segurança a transação (como InnoDB \ ou BDB), você pode colocar o MySQL em modo não autocommit com o seguinte comando:

$this->Model1->query('SET AUTOCOMMIT = 0');
  Para iniciar uma transação usa-se o código abaixo: (Note que só usaremos os códigos de transação apenas em um dos models).
$this->Model1->query('START TRANSACTION');
 O código abaixo mostra dois Models(Model1 e Model2) que não tem relacionamento explicito, sendo gravados no banco unicamente quando os dois são validados e retornam como verdade.  Tentaremos salvar os Model1 e Model2 com os dados vindos de algum formulário e passaremos a ambos o parâmetro atomic com o valor false, para que o CakePHP entenda que ele não deve salvar os modelos relacionados a esses Models(Model1 e Model2) deixando isso a cargo do código que estamos inserindo.
 E depois utilizamos duas variáveis(model1 e model2), para saber se podemos enviar um COMMIT ou um ROLLBACK nas alterações feitas no banco. $this->Model1->saveAll($this->data['Model1'],array('atomic'=>false)); $model1=$this->Model1->getLastInsertId();
$this->Model2->saveAll($this->data['Model2'],array('atomic'=>false)); $model2=$this->Model2->getLastInsertId();

  Por fim testamos as variáveis e se as duas não forem nulas, confirmamos no banco com o comando COMMIT e se por acaso acontecer algum problema com a inserção desses dados o ROLLBACK.
if($model1 != null && $model2 != null){
$this->Model1->query('commit');
echo "Inserção realizado com sucesso!";
}else{
$this->Model1->query('rollback');
echo "Operação não realizada!";
}

 Espero ter ajuda aqueles que estiverem com as mesmas dificuldades que eu tive e gostaria de frisar que essa não é a melhor nem a pior maneira de se fazer transactions utilizando CakePHP e Mysql é só a forma que eu encontrei de fazê-las funcionar sem problemas.
 Qualquer dúvida, reclamação ou sugestão sobre o código é só postar um comentário que eu responderei o mais breve possível.

0 comentários:

Postar um comentário

Deixe seu Comentário