mysql transactions rollback

mysql - Retroceso automático si no se alcanza COMMIT TRANSACTION



transactions rollback (5)

Considera lo siguiente:

START TRANSACTION; BEGIN; INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('''',''production'','''',''300000''); /** Assume there is syntax error SQL here...**/ Blah blah blah DELETE FROM prp_property1 WHERE environment_name = ''production''; COMMIT TRANSACTION;

Pregunta:

Noté que la transacción se retrotrae automáticamente y el intento de inserción del registro falla.

Si no proporciono un controlador de errores o una comprobación de errores junto con ROLLBACK TRANSACTION como se ROLLBACK TRANSACTION anteriormente, ¿es seguro ya que parece estar haciendo el trabajo en un ejemplo como el anterior porque COMMIT TRANSACTION nunca se ejecuta?

Asumo que la transacción se revierte inmediatamente y se descarta tan pronto como se produce un error.


He probado estas tres situaciones; mySQL no retrocede automáticamente.

Un interbloqueo de transacción hace que InnoDB deshaga la transacción completa. Un error de clave duplicada revierte la instrucción SQL. Un error de fila demasiado largo devuelve la instrucción SQL.

Solo los registros afectados fallan, el resto de los registros se realizan correctamente a menos que su aplicación llame explícitamente a "rollback".


Me gustaría agregar a lo que @MarkR ya dijo. El manejo de errores, asumiendo que el motor InnoDB, ocurre como se describe en la documentación del servidor Mysql

  • Si se queda sin espacio de archivos en un espacio de tablas, se produce un error completo en la tabla MySQL e InnoDB revierte la declaración SQL.
  • Un interbloqueo de transacción hace que InnoDB deshaga la transacción completa.
  • Un error de clave duplicada revierte la instrucción SQL
  • Un error de fila demasiado largo revierte la instrucción SQL.
  • La capa de código de MySQL (sobre el nivel del motor de almacenamiento InnoDB) detecta la mayoría de los errores, y revierten la instrucción SQL correspondiente

Mi entendimiento también es que cuando finaliza la sesión de Mysql (cuando finalizan los scripts de php), todo lo que no se confirma se revierte. Todavía tengo que encontrar una fuente realmente confiable para respaldar esta afirmación, así que no confíe en mi palabra.


No, las transacciones no se retrotraen tan pronto como se produce un error. Pero puede que esté utilizando una aplicación cliente que aplique esta política.

Por ejemplo, si está utilizando el cliente de línea de comandos mysql, normalmente se detiene cuando se produce un error y se cerrará. Salir mientras una transacción está en curso hace que se restablezca.

Cuando está escribiendo su propia aplicación, puede controlar la política de reversión, pero hay algunas excepciones:

  • Salir (es decir, desconectarse de la base de datos) siempre revierte una transacción en curso
  • Un tiempo de espera de bloqueo o espera de bloqueo provoca implícitamente una reversión

Aparte de estas condiciones, si invoca un comando que genera un error, el error se devuelve normalmente y puede hacer lo que quiera, incluso de todas formas cometer la transacción.



Usar el procedimiento almacenado Mysql

BEGIN DECLARE exit handler for sqlexception BEGIN ROLLBACK; END; DECLARE exit handler for sqlwarning BEGIN ROLLBACK; END; START TRANSACTION; INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('''',''production'','''',''300000''); [ERROR] COMMIT; END

Puede establecer si la advertencia o la reversión de error, entonces no necesita eliminar, con la transacción se eliminan todas las entradas.