Nosso aplicativo dispara uma consulta INSERT no banco de dados MySQL para adicionar registros. Quero saber se os registros são ou não confirmados automaticamente. Se eu executar o comando ROLLBACK, quando o banco de dados executa uma reversão? É possível um ROLLBACK após um COMMIT?
13
Respostas:
A resposta para sua pergunta depende se você está ou não em uma transação que abrange mais de uma declaração. (Você marcou a pergunta no InnoDB, a resposta seria diferente no MyISAM.)
No manual de referência: http://dev.mysql.com/doc/refman/5.1/en/commit.html
Portanto, 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 agrupar cada instrução entreBEGIN
eCOMMIT
.)No entanto, se você estiver lidando com transações explicitamente, precisará usar
COMMIT
para confirmar o armazenamento dos registros, mas também poderá usá-loROLLBACK
.Você pode iniciar uma transação explicitamente usando
START TRANSACTION
(ouBEGIN
). Isso é independente daautocommit
configuração (ativada por padrão):Como alternativa, se
autocommit=0
eu acho que qualquer declaração após outro final de transação iniciará uma transação (mas você ainda pode usarSTART TRANSACTION
explicitamente); é pelo menos assim que interpreto isso :Mais especificamente, "outra maneira de iniciar uma transação" parece implicar que a configuração "confirmação automática = 0" é suficiente para iniciar uma transação (pelo menos 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 queautocommit=0
, pois pode ficar mais claro para ver quando a transação inicia ou termina.(Como você inicia uma transação pode depender da maneira como seu aplicativo usa o MySQL.)
fonte
Por padrão, o InnoDB está definido como confirmação automática = 1 ou LIGADO . Uma vez confirmados, eles não podem ser revertidos .
Você precisaria fazer uma de 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 um destes no DB Conenction aberto antes de iniciar qualquer SQL significativo
Sob essas duas opções, você precisaria 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. Nenhuma reversão.
fonte