Há duas lições a serem aprendidas aqui:
- Dados de backup
- Execute instruções UPDATE/DELETE em uma transação, para que você possa usar
ROLLBACK
se as coisas não saírem como planejado
Estar ciente do tratamento da transação (autocommit, explícito e implícito) para seu banco de dados pode evitar que você precise restaurar dados de um backup.
As transações controlam a(s) instrução(ões) de manipulação de dados para garantir que sejam atômicas. Ser "atômica" significa que a transação ocorre ou não. A única maneira de sinalizar a conclusão da transação para o banco de dados é usando um comando
COMMIT
ou ROLLBACK
instrução (por ANSI-92, que infelizmente não inclui sintaxe para criar/iniciar uma transação, portanto, é específico do fornecedor). COMMIT
aplica as alterações (se houver) feitas na transação. ROLLBACK
desconsidera quaisquer ações que ocorreram dentro da transação - altamente desejável quando uma instrução UPDATE/DELETE faz algo não intencional . Normalmente, as instruções DML (Insert, Update, Delete) são executadas em uma transação de confirmação automática - elas são confirmadas assim que a instrução for concluída com êxito. O que significa que não há oportunidade de reverter o banco de dados para o estado anterior à execução da instrução em casos como o seu. Quando algo der errado, a única opção de restauração disponível é reconstruir os dados de um backup (desde que exista). No MySQL, autocommit é em por padrão para InnoDB - MyISAM não suporta transações. Ele pode ser desabilitado usando:
SET autocommit = 0
Uma transação explícita ocorre quando as instruções são agrupadas em um bloco de código de transação definido explicitamente - para MySQL, é
START TRANSACTION
. Também requer um COMMIT
feito explicitamente ou ROLLBACK
extrato no final da transação. As transações aninhadas estão além do escopo deste tópico. As transações implícitas são ligeiramente diferentes das explícitas. As transações implícitas não requerem a definição explícita de uma transação. No entanto, como transações explícitas, elas exigem um
COMMIT
ou ROLLBACK
declaração a ser fornecida. Conclusão
As transações explícitas são a solução ideal - elas exigem uma declaração,
COMMIT
ou ROLLBACK
, para finalizar a transação, e o que está acontecendo é claramente indicado para que outros leiam caso haja necessidade. As transações implícitas são aceitáveis se estiver trabalhando com o banco de dados interativamente, mas COMMIT
As declarações só devem ser especificadas depois que os resultados forem testados e completamente determinados como válidos. Isso significa que você deve usar:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...e use apenas
COMMIT;
quando os resultados estão corretos. Dito isso, as instruções UPDATE e DELETE normalmente retornam apenas o número de linhas afetadas, não detalhes específicos. Converta tais declarações em declarações SELECT e revise os resultados para garantir a exatidão antes para tentar a instrução UPDATE/DELETE.
Adendo
As instruções DDL (Data Definition Language) são confirmadas automaticamente - elas não exigem uma instrução COMMIT. IE:Tabela, índice, procedimento armazenado, banco de dados e instruções de criação ou alteração de exibição.