erro de chave duplicada não cancela / rollback mysql transação
-
06-07-2019 - |
Pergunta
Quando estiver em uma transação mysql innodb, eu esperaria um erro de chave duplicada para causar uma reversão. Não, em vez disso, simplesmente gera um erro e continua para o próximo comando. Uma vez que o COMMIT comando é atingido, a transação será comprometida, sans a chave duplicada comando causando.
Este é o comportamento esperado? Se sim, como um iria sobre configurá-lo para que a transação é revertida em vez de comprometido quando tal ocorre um erro?
ambiente de teste:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
BEGIN;
INSERT INTO test VALUES (5);
INSERT INTO test VALUES (5);
COMMIT;
esperado resultado: test
tabela está vazia
real resultado: test
tabela contém um registro com valor de 5
Solução
MySql (e outros motores de sql AFAIK) não reverter automaticamente uma transação se ocorrer um erro.
Você tem que declarar um manipulador de erro que irá reverter a transação:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN
ROLLBACK;
CALL ERROR_ROLLBACK_OCCURRED;
END;
Outras dicas
Se uma inserção falha porque de uma segunda via, os rolos de banco de dados as costas transação para o início dessa declaração .
Ele usa um ponto de salvamento interna feita no início da instrução, em seguida, rola para trás a esse ponto de salvamento.
Ele não reverter toda a transação, porque isso pode não ter sido o que você queria.
O comportamento do cliente mysql é configurável usando parâmetros de linha de comando. Ele pode sair (o que implicitamente rollback) ou continuar.
Se você estiver usando seu próprio aplicativo, o que ele faz é com você.
O MySQL não impor política sobre como você lida com falhas - ele deixa que até a sua aplicação. Então, o que fazer com eles é o seu próprio negócio -. Você pode ignorá-los se você gosta ??p>