Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

willwalker

Como desfazer querys caso haja erro no MySQL

Recommended Posts

Como eu poderia retroceder todas as inserções que fiz naquele exato momento, caso uma das querys dê erro?

 

Eu preciso disso porque tenho várias tabelas relacionadas e algumas não, mas fazem parte desse tal cadastro. E não quero que aconteça duplicidade de cadastros, se alguma das querys der erro. Há alguma maneira de deletar/retroceder os dados cadastrados antes do erro?

 

Abraços Walker

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então ficaria mais ou menos assim, ou exatamente assim? grin.gif


<?php
$erro = 0;

mysql_query("START TRANSACTION");
if(!mysql_query("INSERT INTO...")){ $erro += 1; };
if(!mysql_query("UPDATE tabela... WHERE id = '".mysql_insert_id()."'")){ $erro += 1; };
if(!mysql_query("DELETE FROM... WHERE id = '".mysql_insert_id()."'")){ $erro += 1; };
mysql_query("COMMIT");

if($erro > 0){
	mysql_query("ROLLBACK");
	$erro = 0;
}
?>

 

Abraços Walker

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php

mysql_query("START TRANSACTION");
mysql_query(...);
mysql_query(...);
...

if (mysql_error()){
mysql_query("ROLLBACK");
} else {
mysql_query("COMMIT");
}

?>

 

Usando bloco try ... catch.

 


try {
   mysql_query("START TRANSACTION");
   mysql_query(...);
   mysql_query(...);
   ...
   mysql_query("COMMIT");
} catch (Exception $e) {
   mysql_query("ROLLBACK");
}

 

Usando PDO:

 


try {
   $db->beginTransaction();
   $db->exec(...);
   $db->exec(...);
   ...
   $db->commit();
} catch (Exception $e) {
   $db->rollback();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php

mysql_query("START TRANSACTION");
mysql_query(...);
mysql_query(...);
...

if (mysql_error()){
mysql_query("ROLLBACK");
} else {
mysql_query("COMMIT");
}

?>

 

Estou usando o primeiro exemplo que postou. Quando entra no else (COMMIT), não sei porque mas não está cadastrando nada no banco. Tem que ser feito alguma configuração em meu banco? A Engine é InnoDB.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você certificou-se de que realmente esta entrando no else e executando o commit.

 

Sim, eu coloquei uma mensagem de retorno. O problema era a codificação. Faltava só um utf8_encode();

 

Obrigado, por me explicar e ensinar sobre START TRANSITION. Vou usar bastante em meus trabalhos essa funcionalidade que desconhecia dos bancos relacionais.

 

Abraços Walker

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obs.: O editar diretamente da página está com problemas, ao salvar as alterações as tags html aparecem como texto...<div><br></div><div>Como esse post...</div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.