2009-10-27 10 views
9

En una transacción mysql innodb, esperaría que un error duplicado de clave cause una reversión. No lo hace, en su lugar, simplemente arroja un error y continúa al siguiente comando. Una vez que se llega al comando COMMIT, la transacción se confirmará, sin el comando que causa la clave duplicada.error duplicado de clave no cancela/revoca la transacción mysql

¿Es este el comportamiento esperado? En caso afirmativo, ¿cómo se podría configurar para que la transacción se retrotraiga en lugar de confirmarse cuando se produce dicho error? ambiente

prueba:

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; 

resultado esperado: mesa test está vacía

resultado real: mesa test contiene un registro con un valor de 5

+0

Consulte también: http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling. html –

Respuesta

3

MySql (y otro motor sql AFAIK) no retrotrae automáticamente una transacción si se produce un error.

tienes que declarar un controlador de errores que retrotraer la transacción:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

Si una inserción falla debido a un duplicado, el la base de datos devuelve la transacción al inicio de esa declaración.

Utiliza un punto de guardado interno realizado al principio de la instrucción, luego regresa a ese punto de guardado.

NO deshace toda la transacción, porque puede que no haya sido lo que usted quería.

El comportamiento del cliente mysql se puede configurar mediante parámetros de línea de comandos. Puede salir (lo que se revertiría implícitamente) o continuar.

Si está utilizando su propia aplicación, lo que hace depende de usted.


Mysql no impone POLICY en la forma en que maneja las fallas, sino que deja eso a la altura de su aplicación. Entonces, lo que usted haga con ellos es asunto suyo; puede ignorarlos si lo desea.

+2

Quiero darte 100 puntos de reputación para "Mysql no impone POLÍTICA sobre cómo manejar fallas, eso depende de tu aplicación. Así que lo que haces sobre ellas es asunto tuyo, puedes ignorarlas si quieres " – longneck

+0

, entonces, ¿hay alguna forma de configurar una transacción para que se retrotraiga automáticamente a un error de clave duplicada? ¿o tengo que monitorear el resultado de cada consulta y luego retroceder explícitamente para obtener este comportamiento? – allixsenos

Cuestiones relacionadas