Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Alguém poderia me dar uma luz de como fazer o ROLLBACK funcionar no MySQL?
Minhas tabelas são do tipo InnoDB e mesmo assim o ROLLBACK não rola.
Estou tentando executar essas linhas direto no MySQL só pra testar e não vai....
START TRANSACTION;
INSERT INTO clientes (nome, sobrenome) VALUES ('Teste', 'Teste');
INSERT INTO usuarios (nome, usuario) VALUES ('Teste', '');
ROLLBACK;
Ou seja,
Os registros estão sendo inseridos da mesma forma, enquanto o ROLLBACK obrigaria que fossem desfeitos.
Alguém pode me dar uma luz?
Abraços e FELIZ 2013!
Shini,
Já tentei fazer SET AUTOCOMMIT = 0, não resolveu!
Pelo PHP já tentei
mysqli_autocommit($bdcon, FALSE);
mysqli_query($bdcon, "INSERT INTO pessoas (nome, sobrenome) VALUES ('KKKKK', 'kkkkk')");
mysqli_query($bdcon, "INSERT INTO pessoas (nome, sobrenome) VALUES ('KKKKK', 'kkkkk')");
mysqli_query($bdcon, "INSERT INTO clientes (nome, sobrenome) VALUES ('KKKKK', 'kkkkk')");
mysqli_query($bdcon, "INSERT INTO usuarios (nome, usuario) VALUES ('KKKKK', 'aaaaa')");
mysqli_rollback($bdcon);
Não deu certo mesmo assim!
O que pode ser?
Abraço!
Engraçado que faço um SELECT @@AUTOCOMMIT ele me retorna 0 (desativado), porém mesmo assim ele está gravando automático!
Tente fazer isso utilizando a linha de comando do MySQL, ou uma ferramenta que não o utilize em conjunto com o PHP para ver se o erro persiste.
Segue tentativa de execução e resultados direto no MySQL (phpMyAdmin).
SET AUTOCOMMIT = 0;# MySQL retornou um conjunto vazio (ex. zero registros).
START TRANSACTION;# MySQL retornou um conjunto vazio (ex. zero registros).
INSERT INTO clientes (nome) VALUES ('Teste');# 1 linha afetada.
ROLLBACK;# MySQL retornou um conjunto vazio (ex. zero registros).
Quando vou olhar na tabela, o registro foi inserido!
Tentei copiar o exemplo do MANUAL OFICIAL DO PHP, apenas substituindo o nome das tabelas e não deu certo! Ele continua salvando automatico, ou seja, rollback sem efeito algum!
Está usando MyISAM ?
MyISAM não suporta TRANSACTION..
Se for o caso, troque para InnoDB
SET AUTOCOMMIT = 0;
BEGIN;
START TRANSACTION;
...
ROLLBACK;hinom,
Já estou trabalhando com InnoDB...
Inclusive, pra me assegurar, fiz um:
ALTER TABLE clientes TYPE = InnoDB;
ALTER TABLE clientes ENGINE = InnoDB;
Tentei executar a seguinte QUERY no MySQL
SET AUTOCOMMIT=0;
BEGIN;
START TRANSACTION;
INSERT INTO clientes (nome) VALUES ('TESTE');
ROLLBACK;
Resultado: SEM SUCESSO!
A operação é realizada, é como se o SET AUTOCOMMIT não tivesse efeito algum.
Se eu der um SET AUTOCOMMIT=0; e depois um SELECT @@AUTOCOMMIT, ele me retorna 0 (desativado). Porém quando faço o INSERT e depois ROLLBACK, nada acontece! O INSERT é feito normalmente!
reiniciou o serviço do mysql depois de desativar o autocomit?
Não reiniciei.
Não tenho acesso SSH ao servidor!
É uma hospedagem contratada!
Bem provável seu usuário não possuir permissão para alterações desse nível.
Realize uma solicitação junto ao suporte do servidor de hospedagem.
Perfeito!
Estou fazendo isso e dou um feedback em breve.
Estranho é que ao realizar o SET AUTOCOMMIT=0; ele faz a alteração normal, se dou um SELECT @@AUTOCOMMIT ele me retorna 0 (desativado) perfeitamente...
A não ser que meu usuário ignora configurações realizadas por fora do arquivo de configuração. É, permissão é uma possibilidade!
Estou fazendo novos testes e retorno com o resultado!
Por enquanto, obrigado!
RESOLVIDO!
Realizei a troca de provedor e no novo provedor consegui realizar as alterações citadas!
Obrigado à todos pela paciência e pela ajuda!
O mesmo comando do início do post, funcionou no novo provedor!
Um abraço e FELIZ 2013!
RESOLVIDO!
Realizei a troca de provedor e no novo provedor consegui realizar as alterações citadas!
Obrigado à todos pela paciência e pela ajuda!
O mesmo comando do início do post, funcionou no novo provedor!
Um abraço e FELIZ 2013!
veja se propriedade auto comit esta ativa(true), deixe ela false assim você vai trabalhar com uma transação em 2 fases.
com o auto comit ativo td trasanção é escrita direto no banco por exemplo (inser, update, delete) quando ele esta desativado você é obrigado no final da instrução a colocar comit caso contrario a mundaça não sera efetuada.