Nosso aplicativo dispara uma consulta INSERT ao banco de dados MySQL para adicionar registros. Eu quero saber se os registros são confirmados automaticamente ou não. Se eu executar o comando ROLLBACK, quando o banco de dados executa um rollback? É possível um ROLLBACK após um COMMIT?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
A resposta à sua pergunta depende se você está ou não em uma transação que abrange mais de uma instrução. (Você marcou a pergunta com InnoDB, a resposta seria diferente com MyISAM.)
Do manual de referência: http://dev.mysql.com/doc/refman/5.1/en/commit.html
Então, sim, por padrão, se você estiver apenas usando
INSERT
, os registros inseridos serão confirmados e não há sentido em tentar revertê-los. (Isso é efetivamente o mesmo que envolver cada instrução entreBEGIN
eCOMMIT
.)No entanto, se você estiver lidando com transações explicitamente, terá que usar
COMMIT
para confirmar armazenar os registros, mas também poderá usarROLLBACK
.Você pode iniciar uma transação explicitamente usando
START TRANSACTION
(ouBEGIN
). Isso é independente daautocommit
configuração (ativada por padrão):Alternativamente, if
autocommit=0
, eu acho que qualquer instrução seguindo outro fim de transação, iniciará uma transação (mas você ainda pode usarSTART TRANSACTION
explicitamente); pelo menos é assim que eu interpreto isso :Mais especificamente, "outra maneira de iniciar uma transação" parece implicar que a configuração "autocommit=0" é suficiente para iniciar uma transação (pelo menos um pouco antes de cada instrução no início de uma sessão ou que segue um
COMMIT
/ROLLBACK
). Eu sugeriria usarBEGIN
ouSTART TRANSACTION
explicitamente de qualquer maneira mesmo seautocommit=0
, pois pode deixar mais claro quando a transação começa ou termina.(Como você inicia uma transação pode depender de como seu aplicativo usa o MySQL.)
Por padrão, o InnoDB é definido como autocommit = 1 ou ON . Uma vez confirmados, eles não podem ser revertidos .
Você teria que fazer uma das duas coisas para desativá-lo daqui para frente:
OPÇÃO 1: Adicione isso ao /etc/my.cnf e reinicie o mysql
OPÇÃO 2 : Execute uma dessas na conexão de banco de dados aberta antes de iniciar qualquer SQL significativo
Nessas duas opções, você teria que executar um COMMIT manual ou um ROLLBACK manual .
EMBARGO
Se a tabela for MyISAM, a explicação é mais simples. Como não há transações para o mecanismo de armazenamento MyISAM, todos os INSERTs, UPDATEs e DELETEs executados são permanentes. Nada de retrocessos.