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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top