Estou tentando inserir dados TRUNCATE
em INSERT
uma tabela MySQL InnoDB.
Eu queria ter certeza de que, se alguma instrução na transação falhar, os dados permanecerão intocados.
Não posso ter uma tabela vazia ou corrompida se algo falhar.
Foi assim que planejei fazer.
BEGIN TRANSACTION
TRUNCATE TABLE table_name
INSERT INTO table_name
COMMIT
Então eu aprendi que TRUNCATE TABLE table_name
causa um COMMIT implícito , o que torna toda a transação inútil.
Em seguida, substituí o TRUNCATE TABLE table_name
por uma DELETE FROM table_name
abordagem, que não era ideal - mas também causa um COMMIT implícito !
DROP TABLE table_name
e CREATE TABLE table_name
também causa um COMMIT implícito!
Qual método/lógica é melhor para executar o que estou tentando fazer?
Usando o servidor MySQL 5.6.17 de 64 bits em execução no Windows Server 2008 R2
Como TRUNCATE TABLE faz um commit implícito, não o use .
Desde que a tabela não tenha chaves estrangeiras, você pode fazer isso rapidamente assim:
Se o INSERT for bem-sucedido, execute este
Se o INSERT reverter, apenas reverta
De uma chance !!!
Não causa um commit implícito e deve funcionar bem. Na verdade, estou usando essa solução exata em produção e não vejo nenhum problema em termos de transação (é claro que excluir todas as linhas de uma tabela grande tem um impacto significativo no tamanho da transação, seguido possivelmente por aumento de IO, aumento do tamanho dos logs binários, etc. .)